aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatt Fleming <matt.fleming@intel.com>2011-11-10 10:23:27 +0000
committerMatt Fleming <matt.fleming@intel.com>2011-12-16 16:31:18 +0000
commita941bb474f0c7044edb66eaed3199501215081a0 (patch)
tree4b00e7149d5343aa9bd52ba6c01938a0d16290d5
parent89dc4795d95247b36a4dd85cbcd11ca52371c57c (diff)
downloadsyslinux-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.h15
-rw-r--r--com32/include/syslinux/memscan.h1
-rw-r--r--com32/lib/Makefile2
-rw-r--r--com32/lib/syslinux/firmware.c19
-rw-r--r--com32/lib/syslinux/memscan.c8
-rw-r--r--core/cleanup.c23
-rw-r--r--core/font.c13
-rw-r--r--core/graphics.c2
-rw-r--r--core/init.c15
-rw-r--r--core/init.inc4
-rw-r--r--core/mem/init.c2
-rw-r--r--core/pxelinux.asm2
-rw-r--r--core/timer.inc4
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