Build e820 maps at post time; just copy the pre-built ones at runtime.
Add support for populating memory and map info from coreboot.
# Source files
SRCBOTH=output.c util.c floppy.c ata.c kbd.c pci.c boot.c serial.c clock.c
SRC16=$(SRCBOTH) disk.c system.c mouse.c cdrom.c apm.c pcibios.c
-SRC32=$(SRCBOTH) post.c shadow.c rombios32.c post_menu.c
+SRC32=$(SRCBOTH) post.c shadow.c rombios32.c post_menu.c memmap.c coreboot.c
TABLESRC=font.c cbt.c floppy_dbt.c
cc-option = $(shell if test -z "`$(1) $(2) -S -o /dev/null -xc \
Do a pci scan for ide controllers - don't just assume ISA ports are
available.
+The keyboard driver should detect ctrl+alt+del and reboot the
+machine.
+
Review changes committed to coreboot, virtualbox, qemu, kvm, and bochs
cvs tip.
* bochs cvs (1.209) -- all changes synched
* coreboot (r3348): 1.163 -- no noteworthy enhancements
* qemu (r4675): 1.207 -- supports >4Gig memory
- * kvm (45a442c): 1.182 -- >4gig, e820 vmx pages, enable cache?
+ * kvm (45a442c): 1.182 -- >4gig, e820 vmx pages, enable cache?,
+ wrmsr in smp_start and rombios32, acpi insrcovr table
* virtualbox (r9404): 1.176 -- f11/f12 kbd, lots of mouse changes,
logo, set text mode?, int 1589, floppy data rate?,
dummy_isr_function, int19 calls post
Look at integrating the lgpl vgabios into tree.
Try generating bios tables at compile time.
-
-Move e820 map generation to post time (just have e820 code copy pre
-made tables back to user).
u8 floppy_motor_counter;
u8 floppy_last_status;
u8 floppy_return_status[7];
- u8 other1[0x7];
+ u8 other_49[0x7];
// 40:50
- u8 other2[0x10];
+ u8 other_50[0x10];
// 40:60
- u8 other3[0x7];
+ u8 other_60[0x7];
u32 jump_cs_ip;
u8 dummy;
u32 timer_counter;
// 40:80
u16 kbd_buf_start_offset;
u16 kbd_buf_end_offset;
- u8 other5[7];
+ u8 other_84[7];
u8 floppy_last_data_rate;
u8 disk_status_controller;
u8 disk_error_controller;
// Physical memory available.
u32 ram_size;
+ u16 e820_count;
+ u32 e820_loc;
// ATA Driver data
struct ata_s ata;
#include "ata.h" // hard_drive_setup
#include "kbd.h" // kbd_setup
#include "disk.h" // floppy_drive_setup
+#include "memmap.h" // add_e820
#define bda ((struct bios_data_area_s *)MAKE_FARPTR(SEG_BDA, 0))
#define ebda ((struct extended_bios_data_area_s *)MAKE_FARPTR(SEG_EBDA, 0))
ram_probe(void)
{
dprintf(3, "Find memory size\n");
- u32 rs;
if (CONFIG_COREBOOT) {
- // XXX - just hardcode for now.
- rs = 128*1024*1024;
+ coreboot_fill_map();
} else {
// On emulators, get memory size from nvram.
- rs = (inb_cmos(CMOS_MEM_EXTMEM2_LOW)
- | (inb_cmos(CMOS_MEM_EXTMEM2_HIGH) << 8)) * 65536;
+ 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);
+ add_e820(0, rs, E820_RAM);
+
+ /* reserve 256KB BIOS area at the end of 4 GB */
+ add_e820(0xfffc0000, 256*1024, E820_RESERVED);
}
- SET_EBDA(ram_size, rs);
- dprintf(1, "ram_size=0x%08x\n", rs);
+ // Mark known areas as reserved.
+ add_e820((u32)MAKE_FARPTR(SEG_EBDA, 0), EBDA_SIZE * 1024, E820_RESERVED);
+ add_e820((u32)MAKE_FARPTR(SEG_BIOS, 0), 0x10000, E820_RESERVED);
+
+ dprintf(1, "ram_size=0x%08x\n", GET_EBDA(ram_size));
}
static void
serial_setup();
pic_setup();
+ memmap_setup();
+
ram_probe();
dprintf(1, "Scan for VGA option rom\n");
rombios32_init();
+ memmap_finalize();
+
floppy_drive_setup();
hard_drive_setup();
#include "pci.h" // PCIDevice
#include "types.h" // u32
#include "config.h" // CONFIG_*
+#include "memmap.h" // bios_table_cur_addr
// Memory addresses used by this code. (Note global variables (bss)
// are at 0x40000).
int acpi_enabled;
u32 pm_io_base, smb_io_base;
int pm_sci_int;
-unsigned long bios_table_cur_addr;
-unsigned long bios_table_end_addr;
void uuid_probe(void)
{
#endif
addr = base_addr = GET_EBDA(ram_size) - CONFIG_ACPI_DATA_SIZE;
+ add_e820(addr, CONFIG_ACPI_DATA_SIZE, E820_ACPI);
rsdt_addr = addr;
rsdt = (void *)(addr);
addr += sizeof(*rsdt);
dprintf(1, "ebda_cur_addr: 0x%08lx\n", ebda_cur_addr);
#endif
- bios_table_cur_addr = 0xf0000 | OFFSET_freespace2_start;
- bios_table_end_addr = 0xf0000 | OFFSET_freespace2_end;
- dprintf(1, "bios_table_addr: 0x%08lx end=0x%08lx\n",
- bios_table_cur_addr, bios_table_end_addr);
-
cpu_probe();
smp_probe();
if (acpi_enabled)
acpi_bios_init();
- dprintf(1, "bios_table_cur_addr: 0x%08lx\n", bios_table_cur_addr);
+ dprintf(1, "bios_table_cur_addr: 0x%08x\n", bios_table_cur_addr);
if (bios_table_cur_addr > bios_table_end_addr)
BX_PANIC("bios_table_end_addr overflow!\n");
}
#include "util.h" // irq_restore
#include "biosvar.h" // BIOS_CONFIG_TABLE
#include "ioport.h" // inb
-
-#define E820_RAM 1
-#define E820_RESERVED 2
-#define E820_ACPI 3
-#define E820_NVS 4
-#define E820_UNUSABLE 5
+#include "memmap.h" // E820_RAM
// Use PS2 System Control port A to set A20 enable
static inline u8
}
static void
-set_e820_range(struct bregs *regs, u32 start, u32 end, u16 type, int last)
+handle_15e820(struct bregs *regs)
{
- 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);
+ int count = GET_EBDA(e820_count);
+ if (regs->edx != 0x534D4150 || regs->bx >= count) {
+ set_code_fail(regs, RET_EUNSUPPORTED);
+ return;
+ }
- if (last)
+ struct e820entry *e = &((struct e820entry *)GET_EBDA(e820_loc))[regs->bx];
+ memcpy(MAKE_FARPTR(regs->es, regs->di), e, sizeof(*e));
+ if (regs->bx == count-1)
regs->ebx = 0;
else
regs->ebx++;
regs->eax = 0x534D4150;
- regs->ecx = 0x14;
+ regs->ecx = sizeof(*e);
set_success(regs);
}
-// XXX - should create e820 memory map in post and just copy it here.
-static void
-handle_15e820(struct bregs *regs)
-{
- if (regs->edx != 0x534D4150) {
- set_code_fail(regs, RET_EUNSUPPORTED);
- return;
- }
-
- u32 extended_memory_size = GET_EBDA(ram_size);
- // greater than EFF00000???
- if (extended_memory_size > 0xf0000000)
- // everything after this is reserved memory until we get to 0x100000000
- extended_memory_size = 0xf0000000;
-
- switch (regs->bx) {
- case 0:
- set_e820_range(regs, 0x0000000L, 0x0009fc00L, E820_RAM, 0);
- break;
- case 1:
- set_e820_range(regs, 0x0009fc00L, 0x000a0000L, E820_RESERVED, 0);
- break;
- case 2:
- set_e820_range(regs, 0x000e8000L, 0x00100000L, E820_RESERVED, 0);
- break;
- case 3:
- set_e820_range(regs, 0x00100000L
- , extended_memory_size - CONFIG_ACPI_DATA_SIZE
- , E820_RAM, 0);
- break;
- case 4:
- set_e820_range(regs,
- extended_memory_size - CONFIG_ACPI_DATA_SIZE,
- extended_memory_size, E820_ACPI, 0);
- break;
- case 5:
- /* 256KB BIOS area at the end of 4 GB */
- set_e820_range(regs, 0xfffc0000L, 0x00000000L, E820_RESERVED, 1);
- break;
- default: /* AX=E820, DX=534D4150, BX unrecognized */
- set_code_fail(regs, RET_EUNSUPPORTED);
- }
-}
-
static void
handle_15e8XX(struct bregs *regs)
{
return far_d1;
}
+void *
+memmove(void *d, const void *s, size_t len)
+{
+ if (s >= d)
+ return memcpy(d, s, len);
+
+ d += len-1;
+ s += len-1;
+ while (len--) {
+ *(char*)d = *(char*)s;
+ d--;
+ s--;
+ }
+
+ return d;
+}
+
void
__set_fail(const char *fname, struct bregs *regs)
{
void *memset(void *s, int c, size_t n);
void *memcpy(void *d1, const void *s1, size_t len);
+void *memmove(void *d, const void *s, size_t len);
static inline void
eoi_master_pic()
// post_menu.c
void interactive_bootmenu();
+// coreboot.c
+void coreboot_fill_map();
+
#endif // util.h