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