aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKevin O'Connor <kevin@koconnor.net>2008-05-17 22:20:27 -0400
committerKevin O'Connor <kevin@koconnor.net>2008-05-17 22:20:27 -0400
commit9571ac21e511c7e04d9589797e0d123d2798e2f6 (patch)
tree1ab67bb301677b8a1492cf1cf3e7e86154a9e74c
parent1bb3b5c25284cb98f40f245f5d621721c6959fe1 (diff)
downloadseabios-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.h3
-rw-r--r--src/post.c18
-rw-r--r--src/rombios32.c32
-rw-r--r--src/system.c64
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;
diff --git a/src/post.c b/src/post.c
index 0d8f18e..da65559 100644
--- a/src/post.c
+++ b/src/post.c
@@ -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: