diff options
author | Kevin O'Connor <kevin@koconnor.net> | 2008-05-17 22:20:27 -0400 |
---|---|---|
committer | Kevin O'Connor <kevin@koconnor.net> | 2008-05-17 22:20:27 -0400 |
commit | 9571ac21e511c7e04d9589797e0d123d2798e2f6 (patch) | |
tree | 1ab67bb301677b8a1492cf1cf3e7e86154a9e74c | |
parent | 1bb3b5c25284cb98f40f245f5d621721c6959fe1 (diff) | |
download | seabios-hppa-9571ac21e511c7e04d9589797e0d123d2798e2f6.zip seabios-hppa-9571ac21e511c7e04d9589797e0d123d2798e2f6.tar.gz seabios-hppa-9571ac21e511c7e04d9589797e0d123d2798e2f6.tar.bz2 |
Unify memory size detection.
Figure out memory size once at startup and save in a variable.
Change all run-time locations to use that variable instead of
re-detecting memory size.
-rw-r--r-- | src/biosvar.h | 3 | ||||
-rw-r--r-- | src/post.c | 18 | ||||
-rw-r--r-- | src/rombios32.c | 32 | ||||
-rw-r--r-- | src/system.c | 64 |
4 files changed, 53 insertions, 64 deletions
diff --git a/src/biosvar.h b/src/biosvar.h index 8f694e4..0c68a2e 100644 --- a/src/biosvar.h +++ b/src/biosvar.h @@ -257,6 +257,9 @@ struct extended_bios_data_area_s { // 0x5d u8 other2[0xC4]; + // Physical memory available. + u32 ram_size; + // ATA Driver data struct ata_s ata; @@ -78,6 +78,22 @@ init_ebda() } static void +ram_probe(void) +{ + u32 rs = (inb_cmos(CMOS_MEM_EXTMEM2_LOW) + | (inb_cmos(CMOS_MEM_EXTMEM2_HIGH) << 8)) * 65536; + if (rs) + rs += 16 * 1024 * 1024; + else + rs = ((inb_cmos(CMOS_MEM_EXTMEM_LOW) + | (inb_cmos(CMOS_MEM_EXTMEM_HIGH) << 8)) * 1024 + + 1 * 1024 * 1024); + + SET_EBDA(ram_size, rs); + BX_INFO("ram_size=0x%08x\n", rs); +} + +static void pic_setup() { outb(0x11, PORT_PIC1); @@ -190,6 +206,8 @@ post() serial_setup(); pic_setup(); + ram_probe(); + rom_scan(0xc0000, 0xc7800); printf("BIOS - begin\n\n"); diff --git a/src/rombios32.c b/src/rombios32.c index a1e0722..4db3465 100644 --- a/src/rombios32.c +++ b/src/rombios32.c @@ -86,7 +86,6 @@ int smp_cpus; u32 cpuid_signature; u32 cpuid_features; u32 cpuid_ext_features; -unsigned long ram_size; u8 bios_uuid[16]; #if (CONFIG_USE_EBDA_TABLES == 1) unsigned long ebda_cur_addr; @@ -133,23 +132,6 @@ void cpu_probe(void) cpuid_ext_features = ecx; } -void ram_probe(void) -{ - if (inb_cmos(CMOS_MEM_EXTMEM2_LOW) | inb_cmos(CMOS_MEM_EXTMEM2_HIGH)) - ram_size = (inb_cmos(CMOS_MEM_EXTMEM2_LOW) - | (inb_cmos(CMOS_MEM_EXTMEM2_HIGH) << 8)) * 65536 + - 16 * 1024 * 1024; - else - ram_size = ((inb_cmos(CMOS_MEM_EXTMEM_LOW) - | (inb_cmos(CMOS_MEM_EXTMEM_HIGH) << 8)) - * 1024 + 1 * 1024 * 1024); - BX_INFO("ram_size=0x%08lx\n", ram_size); -#if (CONFIG_USE_EBDA_TABLES == 1) - ebda_cur_addr = ((*(u16 *)(0x40e)) << 4) + 0x380; - BX_INFO("ebda_cur_addr: 0x%08lx\n", ebda_cur_addr); -#endif -} - /****************************************************/ /* SMP probe */ @@ -579,7 +561,7 @@ void pci_bios_init(void) { pci_bios_io_addr = 0xc000; pci_bios_mem_addr = 0xf0000000; - pci_bios_bigmem_addr = ram_size; + pci_bios_bigmem_addr = GET_EBDA(ram_size); if (pci_bios_bigmem_addr < 0x90000000) pci_bios_bigmem_addr = 0x90000000; @@ -645,7 +627,8 @@ static void mptable_init(void) #endif #if (CONFIG_USE_EBDA_TABLES == 1) - mp_config_table = (u8 *)(ram_size - CONFIG_ACPI_DATA_SIZE - MPTABLE_MAX_SIZE); + mp_config_table = (u8 *)(GET_EBDA(ram_size) - CONFIG_ACPI_DATA_SIZE + - MPTABLE_MAX_SIZE); #else bios_table_cur_addr = align(bios_table_cur_addr, 16); mp_config_table = (u8 *)bios_table_cur_addr; @@ -1065,7 +1048,7 @@ void acpi_bios_init(void) bios_table_cur_addr += sizeof(*rsdp); #endif - addr = base_addr = ram_size - CONFIG_ACPI_DATA_SIZE; + addr = base_addr = GET_EBDA(ram_size) - CONFIG_ACPI_DATA_SIZE; rsdt_addr = addr; rsdt = (void *)(addr); addr += sizeof(*rsdt); @@ -1634,7 +1617,7 @@ void smbios_init(void) { unsigned cpu_num, nr_structs = 0, max_struct_size = 0; char *start, *p, *q; - int memsize = ram_size / (1024 * 1024); + int memsize = GET_EBDA(ram_size) / (1024 * 1024); #if (CONFIG_USE_EBDA_TABLES == 1) ebda_cur_addr = align(ebda_cur_addr, 16); @@ -1687,7 +1670,10 @@ void rombios32_init(void) { BX_INFO("Starting rombios32\n"); - ram_probe(); +#if (CONFIG_USE_EBDA_TABLES == 1) + ebda_cur_addr = ((*(u16 *)(0x40e)) << 4) + 0x380; + BX_INFO("ebda_cur_addr: 0x%08lx\n", ebda_cur_addr); +#endif cpu_probe(); diff --git a/src/system.c b/src/system.c index 89d68f1..68fbf54 100644 --- a/src/system.c +++ b/src/system.c @@ -205,12 +205,14 @@ handle_1587(struct bregs *regs) static void handle_1588(struct bregs *regs) { - regs->al = inb_cmos(CMOS_MEM_EXTMEM_LOW); - regs->ah = inb_cmos(CMOS_MEM_EXTMEM_HIGH); + u32 rs = GET_EBDA(ram_size); + // According to Ralf Brown's interrupt the limit should be 15M, // but real machines mostly return max. 63M. - if (regs->ax > 0xffc0) - regs->ax = 0xffc0; + if (rs > 64*1024*1024) + regs->ax = 63 * 1024; + else + regs->ax = (rs - 1*1024*1024) / 1024; set_success(regs); } @@ -259,17 +261,18 @@ handle_15e801(struct bregs *regs) // regs.u.r16.ax = 0; // regs.u.r16.bx = 0; - // Get the amount of extended memory (above 1M) - regs->cl = inb_cmos(CMOS_MEM_EXTMEM_LOW); - regs->ch = inb_cmos(CMOS_MEM_EXTMEM_HIGH); + u32 rs = GET_EBDA(ram_size); - // limit to 15M - if (regs->cx > 0x3c00) - regs->cx = 0x3c00; - - // Get the amount of extended memory above 16M in 64k blocs - regs->dl = inb_cmos(CMOS_MEM_EXTMEM2_LOW); - regs->dh = inb_cmos(CMOS_MEM_EXTMEM2_HIGH); + // Get the amount of extended memory (above 1M) + if (rs > 16*1024*1024) { + // limit to 15M + regs->cx = 15*1024; + // Get the amount of extended memory above 16M in 64k blocks + regs->dx = (rs - 16*1024*1024) / (64*1024); + } else { + regs->cx = (rs - 1*1024*1024) / 1024; + regs->dx = 0; + } // Set configured memory equal to extended memory regs->ax = regs->cx; @@ -281,17 +284,9 @@ handle_15e801(struct bregs *regs) static void set_e820_range(struct bregs *regs, u32 start, u32 end, u16 type, int last) { - SET_FARVAR(regs->es, *(u16*)(regs->di+0), start); - SET_FARVAR(regs->es, *(u16*)(regs->di+2), start >> 16); - SET_FARVAR(regs->es, *(u16*)(regs->di+4), 0x00); - SET_FARVAR(regs->es, *(u16*)(regs->di+6), 0x00); - - end -= start; - SET_FARVAR(regs->es, *(u16*)(regs->di+8), end); - SET_FARVAR(regs->es, *(u16*)(regs->di+10), end >> 16); - SET_FARVAR(regs->es, *(u16*)(regs->di+12), 0x0000); - SET_FARVAR(regs->es, *(u16*)(regs->di+14), 0x0000); - + u32 size = end - start; + SET_FARVAR(regs->es, *(u64*)(regs->di+0), start); + SET_FARVAR(regs->es, *(u64*)(regs->di+8), size); SET_FARVAR(regs->es, *(u16*)(regs->di+16), type); SET_FARVAR(regs->es, *(u16*)(regs->di+18), 0x0); @@ -313,24 +308,11 @@ handle_15e820(struct bregs *regs) return; } - u32 extended_memory_size = inb_cmos(CMOS_MEM_EXTMEM2_HIGH); - extended_memory_size <<= 8; - extended_memory_size |= inb_cmos(CMOS_MEM_EXTMEM2_LOW); - extended_memory_size *= 64; + u32 extended_memory_size = GET_EBDA(ram_size); // greater than EFF00000??? - if (extended_memory_size > 0x3bc000) + if (extended_memory_size > 0xf0000000) // everything after this is reserved memory until we get to 0x100000000 - extended_memory_size = 0x3bc000; - extended_memory_size *= 1024; - extended_memory_size += (16L * 1024 * 1024); - - if (extended_memory_size <= (16L * 1024 * 1024)) { - extended_memory_size = inb_cmos(CMOS_MEM_EXTMEM_HIGH); - extended_memory_size <<= 8; - extended_memory_size |= inb_cmos(CMOS_MEM_EXTMEM_LOW); - extended_memory_size *= 1024; - extended_memory_size += 1 * 1024 * 1024; - } + extended_memory_size = 0xf0000000; switch (regs->bx) { case 0: |