Revision 967032c3 hw/pc.c

b/hw/pc.c
188 188
}
189 189

  
190 190
/* hd_table must contain 4 block drivers */
191
static void cmos_init(int ram_size, const char *boot_device, BlockDriverState **hd_table)
191
static void cmos_init(ram_addr_t ram_size, ram_addr_t above_4g_mem_size,
192
                      const char *boot_device, BlockDriverState **hd_table)
192 193
{
193 194
    RTCState *s = rtc_state;
194 195
    int nbds, bds[3] = { 0, };
......
211 212
    rtc_set_memory(s, 0x30, val);
212 213
    rtc_set_memory(s, 0x31, val >> 8);
213 214

  
215
    if (above_4g_mem_size) {
216
        rtc_set_memory(s, 0x5b, (unsigned int)above_4g_mem_size >> 16);
217
        rtc_set_memory(s, 0x5c, (unsigned int)above_4g_mem_size >> 24);
218
        rtc_set_memory(s, 0x5d, (uint64_t)above_4g_mem_size >> 32);
219
    }
220

  
214 221
    if (ram_size > (16 * 1024 * 1024))
215 222
        val = (ram_size / 65536) - ((16 * 1024 * 1024) / 65536);
216 223
    else
......
676 683
}
677 684

  
678 685
/* PC hardware initialisation */
679
static void pc_init1(int ram_size, int vga_ram_size,
686
static void pc_init1(ram_addr_t ram_size, int vga_ram_size,
680 687
                     const char *boot_device, DisplayState *ds,
681 688
                     const char *kernel_filename, const char *kernel_cmdline,
682 689
                     const char *initrd_filename,
......
685 692
    char buf[1024];
686 693
    int ret, linux_boot, i;
687 694
    ram_addr_t ram_addr, vga_ram_addr, bios_offset, vga_bios_offset;
695
    ram_addr_t below_4g_mem_size, above_4g_mem_size = 0;
688 696
    int bios_size, isa_bios_size, vga_bios_size;
689 697
    PCIBus *pci_bus;
690 698
    int piix3_devfn = -1;
......
696 704
    BlockDriverState *hd[MAX_IDE_BUS * MAX_IDE_DEVS];
697 705
    BlockDriverState *fd[MAX_FD];
698 706

  
707
    if (ram_size >= 0xe0000000 ) {
708
        above_4g_mem_size = ram_size - 0xe0000000;
709
        below_4g_mem_size = 0xe0000000;
710
    } else {
711
        below_4g_mem_size = ram_size;
712
    }
713

  
699 714
    linux_boot = (kernel_filename != NULL);
700 715

  
701 716
    /* init CPUs */
......
730 745

  
731 746
    /* allocate RAM */
732 747
    ram_addr = qemu_ram_alloc(ram_size);
733
    cpu_register_physical_memory(0, ram_size, ram_addr);
748
    cpu_register_physical_memory(0, below_4g_mem_size, ram_addr);
749

  
750
    /* above 4giga memory allocation */
751
    if (above_4g_mem_size > 0) {
752
        cpu_register_physical_memory(0x100000000ULL, above_4g_mem_size,
753
                                     ram_addr + below_4g_mem_size);
754
    }
734 755

  
735 756
    /* allocate VGA RAM */
736 757
    vga_ram_addr = qemu_ram_alloc(vga_ram_size);
......
950 971
    }
951 972
    floppy_controller = fdctrl_init(i8259[6], 2, 0, 0x3f0, fd);
952 973

  
953
    cmos_init(ram_size, boot_device, hd);
974
    cmos_init(below_4g_mem_size, above_4g_mem_size, boot_device, hd);
954 975

  
955 976
    if (pci_enabled && usb_enabled) {
956 977
        usb_uhci_piix3_init(pci_bus, piix3_devfn + 2);
......
990 1011
    }
991 1012
}
992 1013

  
993
static void pc_init_pci(int ram_size, int vga_ram_size,
1014
static void pc_init_pci(ram_addr_t ram_size, int vga_ram_size,
994 1015
                        const char *boot_device, DisplayState *ds,
995 1016
                        const char *kernel_filename,
996 1017
                        const char *kernel_cmdline,
......
1002 1023
             initrd_filename, 1, cpu_model);
1003 1024
}
1004 1025

  
1005
static void pc_init_isa(int ram_size, int vga_ram_size,
1026
static void pc_init_isa(ram_addr_t ram_size, int vga_ram_size,
1006 1027
                        const char *boot_device, DisplayState *ds,
1007 1028
                        const char *kernel_filename,
1008 1029
                        const char *kernel_cmdline,

Also available in: Unified diff