Changeset 12233 in vbox for trunk/src/VBox/Devices/PC
- Timestamp:
- Sep 8, 2008 3:41:38 PM (16 years ago)
- svn:sync-xref-src-repo-rev:
- 36221
- Location:
- trunk/src/VBox/Devices/PC
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/PC/BIOS/rombios.c
r11982 r12233 4548 4548 4549 4549 4550 void set_e820_range(ES, DI, start, end, type)4550 void set_e820_range(ES, DI, start, end, extra_start, extra_end, type) 4551 4551 Bit16u ES; 4552 4552 Bit16u DI; 4553 4553 Bit32u start; 4554 4554 Bit32u end; 4555 Bit8u extra_start; 4556 Bit8u extra_end; 4555 4557 Bit16u type; 4556 4558 { … … 4558 4560 write_word(ES, DI+2, start >> 16); 4559 4561 write_word(ES, DI+4, 0x00); 4562 write_word(ES, DI+4, extra_start); 4560 4563 write_word(ES, DI+6, 0x00); 4561 4564 4562 4565 end -= start; 4566 extra_end -= extra_start; 4563 4567 write_word(ES, DI+8, end); 4564 4568 write_word(ES, DI+10, end >> 16); … … 4567 4571 write_word(ES, DI+12, 0x0001); 4568 4572 else 4569 write_word(ES, DI+12, 0x0000); 4573 // XXX: nike - is it really correct? see QEMU BIOS patch 4574 write_word(ES, DI+12, extra_end); 4570 4575 #else /* !VBOX */ 4571 4576 write_word(ES, DI+12, 0x0000); … … 4583 4588 { 4584 4589 Bit32u extended_memory_size=0; // 64bits long 4590 Bit32u extra_lowbits_memory_size=0; 4585 4591 Bit16u CX,DX; 4592 Bit8u extra_highbits_memory_size=0; 4586 4593 4587 4594 BX_DEBUG_INT15("int15 AX=%04x\n",regs.u.r16.ax); … … 4657 4664 } 4658 4665 4666 extra_lowbits_memory_size = inb_cmos(0x61); 4667 extra_lowbits_memory_size <<= 8; 4668 extra_lowbits_memory_size |= inb_cmos(0x62); 4669 extra_lowbits_memory_size *= 64; 4670 extra_lowbits_memory_size *= 1024; 4671 extra_highbits_memory_size = inb_cmos(0x63); 4672 4659 4673 switch(regs.u.r16.bx) 4660 4674 { 4661 4675 case 0: 4662 4676 set_e820_range(ES, regs.u.r16.di, 4663 0x0000000L, 0x0009fc00L, 1);4677 0x0000000L, 0x0009fc00L, 0, 0, 1); 4664 4678 regs.u.r32.ebx = 1; 4665 4679 regs.u.r32.eax = 0x534D4150; … … 4670 4684 case 1: 4671 4685 set_e820_range(ES, regs.u.r16.di, 4672 0x0009fc00L, 0x000a0000L, 2);4686 0x0009fc00L, 0x000a0000L, 0, 0, 2); 4673 4687 regs.u.r32.ebx = 2; 4674 4688 regs.u.r32.eax = 0x534D4150; … … 4688 4702 * A 128K area starting from 0xd0000 works. */ 4689 4703 set_e820_range(ES, regs.u.r16.di, 4690 0x000f0000L, 0x00100000L, 2);4704 0x000f0000L, 0x00100000L, 0, 0, 2); 4691 4705 #else /* !VBOX */ 4692 4706 set_e820_range(ES, regs.u.r16.di, 4693 0x000e8000L, 0x00100000L, 2);4707 0x000e8000L, 0x00100000L, 0, 0, 2); 4694 4708 #endif /* !VBOX */ 4695 4709 regs.u.r32.ebx = 3; … … 4702 4716 set_e820_range(ES, regs.u.r16.di, 4703 4717 0x00100000L, 4704 extended_memory_size - ACPI_DATA_SIZE , 1);4718 extended_memory_size - ACPI_DATA_SIZE ,0, 0, 1); 4705 4719 regs.u.r32.ebx = 4; 4706 4720 regs.u.r32.eax = 0x534D4150; … … 4712 4726 set_e820_range(ES, regs.u.r16.di, 4713 4727 extended_memory_size - ACPI_DATA_SIZE, 4714 extended_memory_size, 3); // ACPI RAM4728 extended_memory_size, 0, 0, 3); // ACPI RAM 4715 4729 regs.u.r32.ebx = 5; 4716 4730 regs.u.r32.eax = 0x534D4150; … … 4722 4736 /* 256KB BIOS area at the end of 4 GB */ 4723 4737 set_e820_range(ES, regs.u.r16.di, 4724 0xfffc0000L, 0x00000000L, 2); 4738 0xfffc0000L, 0x00000000L, 0, 0, 2); 4739 if (extra_highbits_memory_size || extra_lowbits_memory_size) 4740 regs.u.r32.ebx = 6; 4741 else 4742 regs.u.r32.ebx = 0; 4743 regs.u.r32.eax = 0x534D4150; 4744 regs.u.r32.ecx = 0x14; 4745 CLEAR_CF(); 4746 return; 4747 case 6: 4748 /* Maping of memory above 4 GB */ 4749 set_e820_range(ES, regs.u.r16.di, 4750 0x00000000L, extra_lowbits_memory_size, 4751 1, extra_highbits_memory_size + 1, 1); 4725 4752 regs.u.r32.ebx = 0; 4726 4753 regs.u.r32.eax = 0x534D4150; -
trunk/src/VBox/Devices/PC/DevPcBios.cpp
r12095 r12233 154 154 /** PXE debug logging enabled? */ 155 155 uint8_t u8PXEDebug; 156 /** Number of logical CPUs in guest */ 157 uint16_t u16numCPUs; 156 158 } DEVPCBIOS, *PDEVPCBIOS; 157 159 … … 500 502 * Memory sizes. 501 503 */ 504 uint64_t ramInK = pThis->cbRam / _1K; 505 uint64_t above4GInK, below4GInK; 506 if (ramInK > 0xe0000000) 507 { 508 above4GInK = ramInK - 0xe0000000; 509 below4GInK = 0xe0000000; 510 } 511 else 512 { 513 above4GInK = 0; 514 below4GInK = ramInK; 515 } 516 517 502 518 /* base memory. */ 503 u32 = pThis->cbRam > 640 ? 640 : (uint32_t)pThis->cbRam / _1K;519 u32 = below4GInK > 640 ? 640 : (uint32_t)below4GInK; 504 520 pcbiosCmosWrite(pDevIns, 0x15, u32 & 0xff); /* 15h - Base Memory in K, Low Byte */ 505 521 pcbiosCmosWrite(pDevIns, 0x16, u32 >> 8); /* 16h - Base Memory in K, High Byte */ 506 522 507 523 /* Extended memory, up to 65MB */ 508 u32 = pThis->cbRam >= 65 * _1M ? 0xffff : ((uint32_t)pThis->cbRam - _1M) / _1K;524 u32 = below4GInK >= 65 * _1K ? 0xffff : ((uint32_t)below4GInK - _1K); 509 525 pcbiosCmosWrite(pDevIns, 0x17, u32 & 0xff); /* 17h - Extended Memory in K, Low Byte */ 510 526 pcbiosCmosWrite(pDevIns, 0x18, u32 >> 8); /* 18h - Extended Memory in K, High Byte */ … … 513 529 514 530 /* Bochs BIOS specific? Anyway, it's the amount of memory above 16MB */ 515 if ( pThis->cbRam > 16 * _1M)516 { 517 u32 = (uint32_t)( ( pThis->cbRam - 16 * _1M) / _64K);531 if (below4GInK > 16 * _1K) 532 { 533 u32 = (uint32_t)( (below4GInK - 16 * _1K) / 64 ); 518 534 u32 = RT_MIN(u32, 0xffff); 519 535 } … … 522 538 pcbiosCmosWrite(pDevIns, 0x34, u32 & 0xff); 523 539 pcbiosCmosWrite(pDevIns, 0x35, u32 >> 8); 540 541 /* RAM above 4G */ 542 pcbiosCmosWrite(pDevIns, 0x61, above4GInK >> 16); 543 pcbiosCmosWrite(pDevIns, 0x62, above4GInK >> 24); 544 pcbiosCmosWrite(pDevIns, 0x63, above4GInK >> 32); 545 546 /* 547 * Number of CPUs. 548 */ 549 pcbiosCmosWrite(pDevIns, 0x60, pThis->u16numCPUs & 0xff); 524 550 525 551 /*
Note:
See TracChangeset
for help on using the changeset viewer.