diff options
author | Matt Fleming <matt.fleming@intel.com> | 2011-11-10 10:23:27 +0000 |
---|---|---|
committer | Matt Fleming <matt.fleming@intel.com> | 2011-12-16 16:31:18 +0000 |
commit | a941bb474f0c7044edb66eaed3199501215081a0 (patch) | |
tree | 4b00e7149d5343aa9bd52ba6c01938a0d16290d5 | |
parent | 89dc4795d95247b36a4dd85cbcd11ca52371c57c (diff) | |
download | syslinux-a941bb474f0c7044edb66eaed3199501215081a0.tar.gz syslinux-a941bb474f0c7044edb66eaed3199501215081a0.tar.xz syslinux-a941bb474f0c7044edb66eaed3199501215081a0.zip |
core: Add firmware backend support
In an upcoming patch series we're going to need to abstract the
firmware operations because they will be provided by both BIOS and
EFI.
Signed-off-by: Matt Fleming <matt.fleming@intel.com>
-rw-r--r-- | com32/include/syslinux/firmware.h | 15 | ||||
-rw-r--r-- | com32/include/syslinux/memscan.h | 1 | ||||
-rw-r--r-- | com32/lib/Makefile | 2 | ||||
-rw-r--r-- | com32/lib/syslinux/firmware.c | 19 | ||||
-rw-r--r-- | com32/lib/syslinux/memscan.c | 8 | ||||
-rw-r--r-- | core/cleanup.c | 23 | ||||
-rw-r--r-- | core/font.c | 13 | ||||
-rw-r--r-- | core/graphics.c | 2 | ||||
-rw-r--r-- | core/init.c | 15 | ||||
-rw-r--r-- | core/init.inc | 4 | ||||
-rw-r--r-- | core/mem/init.c | 2 | ||||
-rw-r--r-- | core/pxelinux.asm | 2 | ||||
-rw-r--r-- | core/timer.inc | 4 |
13 files changed, 86 insertions, 24 deletions
diff --git a/com32/include/syslinux/firmware.h b/com32/include/syslinux/firmware.h new file mode 100644 index 00000000..edb0f948 --- /dev/null +++ b/com32/include/syslinux/firmware.h @@ -0,0 +1,15 @@ +#ifndef _SYSLINUX_FIRMWARE_H +#define _SYSLINUX_FIRMWARE_H + +struct firmware { + void (*init)(void); + int (*scan_memory)(scan_memory_callback_t, void *); + void (*adjust_screen)(void); + void (*cleanup)(void); +}; + +extern struct firmware *firmware; + +extern void syslinux_register_bios(void); + +#endif /* _SYSLINUX_FIRMWARE_H */ diff --git a/com32/include/syslinux/memscan.h b/com32/include/syslinux/memscan.h index db795439..c3ebf847 100644 --- a/com32/include/syslinux/memscan.h +++ b/com32/include/syslinux/memscan.h @@ -34,5 +34,6 @@ typedef int (*scan_memory_callback_t) (void *, addr_t, addr_t, bool); int syslinux_scan_memory(scan_memory_callback_t callback, void *data); +int bios_scan_memory(scan_memory_callback_t callback, void *data); #endif /* _SYSLINUX_MEMSCAN_H */ diff --git a/com32/lib/Makefile b/com32/lib/Makefile index 10fb4deb..11c7c48c 100644 --- a/com32/lib/Makefile +++ b/com32/lib/Makefile @@ -169,7 +169,7 @@ LIBOTHER_OBJS = \ \ sys/x86_init_fpu.o math/pow.o math/strtod.o \ \ - syslinux/memscan.o + syslinux/memscan.o syslinux/firmware.o MINLIBOBJS = \ $(LIBOTHER_OBJS) \ diff --git a/com32/lib/syslinux/firmware.c b/com32/lib/syslinux/firmware.c new file mode 100644 index 00000000..e5dc68b2 --- /dev/null +++ b/com32/lib/syslinux/firmware.c @@ -0,0 +1,19 @@ +#include <sys/io.h> +#include <fs.h> +#include <syslinux/memscan.h> +#include <bios.h> +#include <syslinux/firmware.h> + +struct firmware *firmware = NULL; + +struct firmware bios_fw = { + .init = bios_init, + .scan_memory = bios_scan_memory, + .adjust_screen = bios_adjust_screen, + .cleanup = bios_cleanup_hardware, +}; + +void syslinux_register_bios(void) +{ + firmware = &bios_fw; +} diff --git a/com32/lib/syslinux/memscan.c b/com32/lib/syslinux/memscan.c index fc676cbf..ccd0e5cc 100644 --- a/com32/lib/syslinux/memscan.c +++ b/com32/lib/syslinux/memscan.c @@ -40,6 +40,7 @@ #include <com32.h> #include <syslinux/memscan.h> +#include <syslinux/firmware.h> struct e820_entry { uint64_t start; @@ -47,7 +48,7 @@ struct e820_entry { uint32_t type; }; -int syslinux_scan_memory(scan_memory_callback_t callback, void *data) +int bios_scan_memory(scan_memory_callback_t callback, void *data) { static com32sys_t ireg; com32sys_t oreg; @@ -156,3 +157,8 @@ int syslinux_scan_memory(scan_memory_callback_t callback, void *data) return 0; } + +int syslinux_scan_memory(scan_memory_callback_t callback, void *data) +{ + return firmware->scan_memory(callback, data); +} diff --git a/core/cleanup.c b/core/cleanup.c index 7bf1df2e..4abefcd0 100644 --- a/core/cleanup.c +++ b/core/cleanup.c @@ -12,9 +12,11 @@ */ #include <com32.h> #include <core.h> +#include <syslinux/memscan.h> +#include <syslinux/firmware.h> -extern void timer_cleanup(void); extern void comboot_cleanup_api(void); +extern void bios_timer_cleanup(void); /* * cleanup.c @@ -22,12 +24,7 @@ extern void comboot_cleanup_api(void); * Some final tidying before jumping to a kernel or bootsector */ -/* - * cleanup_hardware: - * - * Shut down anything transient. - */ -void cleanup_hardware(void) +void bios_cleanup_hardware(void) { /* * TODO @@ -39,8 +36,18 @@ void cleanup_hardware(void) __intcall(0x13, &zero_regs, NULL); call16(comboot_cleanup_api, &zero_regs, NULL); - call16(timer_cleanup, &zero_regs, NULL); + call16(bios_timer_cleanup, &zero_regs, NULL); /* If we enabled serial port interrupts, clean them up now */ sirq_cleanup(); } + +/* + * cleanup_hardware: + * + * Shut down anything transient. + */ +void cleanup_hardware(void) +{ + firmware->cleanup(); +} diff --git a/core/font.c b/core/font.c index b14d3d2a..ff98635c 100644 --- a/core/font.c +++ b/core/font.c @@ -103,7 +103,7 @@ void loadfont(char *filename) /* * use_font: * This routine activates whatever font happens to be in the - * vgafontbuf, and updates the adjust_screen data. + * vgafontbuf, and updates the bios_adjust_screen data. * Must be called with CS = DS */ void use_font(void) @@ -141,7 +141,7 @@ void use_font(void) /* 8 pixels/character */ VidCols = ((GXPixCols >> 3) - 1); - /* No need to call adjust_screen */ + /* No need to call bios_adjust_screen */ return; } else { ireg.eax.w[0] = 0x1110; /* Load into VGA RAM */ @@ -156,16 +156,17 @@ void use_font(void) ireg.eax.w[0] = 0x1103; /* Select page 0 */ __intcall(0x10, &ireg, NULL); } + } - adjust_screen(); + bios_adjust_screen(); } /* - * adjust_screen: Set the internal variables associated with the screen size. + * bios_adjust_screen: Set the internal variables associated with the screen size. * This is a subroutine in case we're loading a custom font. */ -void adjust_screen(void) +void bios_adjust_screen(void) { com32sys_t ireg, oreg; volatile uint8_t *vidrows = BIOS_vidrows; @@ -191,5 +192,5 @@ void adjust_screen(void) void pm_adjust_screen(com32sys_t *regs) { - adjust_screen(); + bios_adjust_screen(); } diff --git a/core/graphics.c b/core/graphics.c index 864550b1..ff3a1899 100644 --- a/core/graphics.c +++ b/core/graphics.c @@ -370,7 +370,7 @@ void pm_usingvga(com32sys_t *regs) if (UsingVGA & 0x08) regs->eflags.l &= ~EFLAGS_CF; else { - adjust_screen(); + bios_adjust_screen(); set_flags(regs, EFLAGS_CF); } } diff --git a/core/init.c b/core/init.c index c1ba298e..46492c5d 100644 --- a/core/init.c +++ b/core/init.c @@ -4,6 +4,9 @@ #include <fs.h> #include <bios.h> +#include <syslinux/memscan.h> +#include <syslinux/firmware.h> + static uint16_t min_lowmem_heap = 65536; extern char __lowmem_heap[]; uint8_t KbdFlags; /* Check for keyboard escapes */ @@ -61,7 +64,9 @@ static inline void bios_timer_init(void) *hook = &timer_irq; } -void init(com32sys_t *regs) +extern uint8_t KbdMap[]; +extern uint8_t bios_free_mem; +void bios_init(void) { int i; @@ -71,12 +76,18 @@ void init(com32sys_t *regs) for (i = 0; i < 256; i++) KbdMap[i] = i; - adjust_screen(); + bios_adjust_screen(); printf_init(); /* Init the memory subsystem */ + bios_free_mem = (uint16_t *)0x413; mem_init(); /* CPU-dependent initialization and related checks. */ check_escapes(); } + +void init(com32sys_t *regs) +{ + firmware->init(); +} diff --git a/core/init.inc b/core/init.inc index 286b3803..4ee68b27 100644 --- a/core/init.inc +++ b/core/init.inc @@ -28,7 +28,9 @@ common_init: cmp eax,__pm_code_len jne kaboom - extern init + extern syslinux_register_bios, init + + pm_call syslinux_register_bios pm_call init ; diff --git a/core/mem/init.c b/core/mem/init.c index 2951bb09..39a34e3e 100644 --- a/core/mem/init.c +++ b/core/mem/init.c @@ -66,11 +66,11 @@ static void mpool_dump(enum heap heap) } #endif +uint16_t *bios_free_mem; void mem_init(void) { struct free_arena_header *fp; int i; - uint16_t *bios_free_mem = (uint16_t *)0x413; //dprintf("enter"); diff --git a/core/pxelinux.asm b/core/pxelinux.asm index 68cb864d..e4c2f83b 100644 --- a/core/pxelinux.asm +++ b/core/pxelinux.asm @@ -341,7 +341,7 @@ pxenv: jnz .store_stack .disable_timer: - call timer_cleanup + call bios_timer_cleanup .store_stack: mov [cs:PXEStack],sp diff --git a/core/timer.inc b/core/timer.inc index 2bf0a219..9f42fdf2 100644 --- a/core/timer.inc +++ b/core/timer.inc @@ -32,8 +32,8 @@ timer_init: mov dword [BIOS_timer_hook],timer_irq ret - global timer_cleanup -timer_cleanup: + global bios_timer_cleanup +bios_timer_cleanup: ; Unhook INT 1Ch mov eax,[BIOS_timer_next] mov [BIOS_timer_hook],eax |