Revision b9e17a34 hw/ppc_oldworld.c

b/hw/ppc_oldworld.c
59 59
    return (addr & 0x0fffffff) + KERNEL_LOAD_ADDR;
60 60
}
61 61

  
62
static target_phys_addr_t round_page(target_phys_addr_t addr)
63
{
64
    return (addr + TARGET_PAGE_SIZE - 1) & TARGET_PAGE_MASK;
65
}
66

  
62 67
static void ppc_heathrow_init (ram_addr_t ram_size,
63 68
                               const char *boot_device,
64 69
                               const char *kernel_filename,
......
71 76
    qemu_irq *pic, **heathrow_irqs;
72 77
    int linux_boot, i;
73 78
    ram_addr_t ram_offset, bios_offset;
74
    uint32_t kernel_base, initrd_base;
79
    uint32_t kernel_base, initrd_base, cmdline_base = 0;
75 80
    int32_t kernel_size, initrd_size;
76 81
    PCIBus *pci_bus;
77 82
    MacIONVRAMState *nvr;
......
157 162
        }
158 163
        /* load initrd */
159 164
        if (initrd_filename) {
160
            initrd_base = INITRD_LOAD_ADDR;
165
            initrd_base = round_page(kernel_base + kernel_size + KERNEL_GAP);
161 166
            initrd_size = load_image_targphys(initrd_filename, initrd_base,
162 167
                                              ram_size - initrd_base);
163 168
            if (initrd_size < 0) {
......
165 170
                         initrd_filename);
166 171
                exit(1);
167 172
            }
173
            cmdline_base = round_page(initrd_base + initrd_size);
168 174
        } else {
169 175
            initrd_base = 0;
170 176
            initrd_size = 0;
177
            cmdline_base = round_page(kernel_base + kernel_size + KERNEL_GAP);
171 178
        }
172 179
        ppc_boot_device = 'm';
173 180
    } else {
......
278 285
    fw_cfg_add_i32(fw_cfg, FW_CFG_KERNEL_ADDR, kernel_base);
279 286
    fw_cfg_add_i32(fw_cfg, FW_CFG_KERNEL_SIZE, kernel_size);
280 287
    if (kernel_cmdline) {
281
        fw_cfg_add_i32(fw_cfg, FW_CFG_KERNEL_CMDLINE, CMDLINE_ADDR);
282
        pstrcpy_targphys("cmdline", CMDLINE_ADDR, TARGET_PAGE_SIZE, kernel_cmdline);
288
        fw_cfg_add_i32(fw_cfg, FW_CFG_KERNEL_CMDLINE, cmdline_base);
289
        pstrcpy_targphys("cmdline", cmdline_base, TARGET_PAGE_SIZE, kernel_cmdline);
283 290
    } else {
284 291
        fw_cfg_add_i32(fw_cfg, FW_CFG_KERNEL_CMDLINE, 0);
285 292
    }

Also available in: Unified diff