Revision 00f82b8a hw/pc.c

b/hw/pc.c
190 190
}
191 191

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

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

  
216 223
    if (ram_size > (16 * 1024 * 1024))
217 224
        val = (ram_size / 65536) - ((16 * 1024 * 1024) / 65536);
218 225
    else
......
678 685
}
679 686

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

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

  
701 716
    linux_boot = (kernel_filename != NULL);
702 717

  
703 718
    /* init CPUs */
......
732 747

  
733 748
    /* allocate RAM */
734 749
    ram_addr = qemu_ram_alloc(ram_size);
735
    cpu_register_physical_memory(0, ram_size, ram_addr);
750
    cpu_register_physical_memory(0, below_4g_mem_size, ram_addr);
751

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

  
737 758
    /* allocate VGA RAM */
738 759
    vga_ram_addr = qemu_ram_alloc(vga_ram_size);
......
952 973
    }
953 974
    floppy_controller = fdctrl_init(i8259[6], 2, 0, 0x3f0, fd);
954 975

  
955
    cmos_init(ram_size, boot_device, hd);
976
    cmos_init(below_4g_mem_size, above_4g_mem_size, boot_device, hd);
956 977

  
957 978
    if (pci_enabled && usb_enabled) {
958 979
        usb_uhci_piix3_init(pci_bus, piix3_devfn + 2);
......
992 1013
    }
993 1014
}
994 1015

  
995
static void pc_init_pci(int ram_size, int vga_ram_size,
1016
static void pc_init_pci(ram_addr_t ram_size, int vga_ram_size,
996 1017
                        const char *boot_device, DisplayState *ds,
997 1018
                        const char *kernel_filename,
998 1019
                        const char *kernel_cmdline,
......
1004 1025
             initrd_filename, 1, cpu_model);
1005 1026
}
1006 1027

  
1007
static void pc_init_isa(int ram_size, int vga_ram_size,
1028
static void pc_init_isa(ram_addr_t ram_size, int vga_ram_size,
1008 1029
                        const char *boot_device, DisplayState *ds,
1009 1030
                        const char *kernel_filename,
1010 1031
                        const char *kernel_cmdline,

Also available in: Unified diff