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