diff options
Diffstat (limited to 'com32/lib/syslinux')
-rw-r--r-- | com32/lib/syslinux/cleanup.c | 2 | ||||
-rw-r--r-- | com32/lib/syslinux/dsinfo.c | 9 | ||||
-rw-r--r-- | com32/lib/syslinux/load_linux.c | 82 | ||||
-rw-r--r-- | com32/lib/syslinux/memscan.c | 8 | ||||
-rw-r--r-- | com32/lib/syslinux/serial.c | 15 | ||||
-rw-r--r-- | com32/lib/syslinux/shuffle.c | 9 | ||||
-rw-r--r-- | com32/lib/syslinux/version.c | 2 |
7 files changed, 39 insertions, 88 deletions
diff --git a/com32/lib/syslinux/cleanup.c b/com32/lib/syslinux/cleanup.c index 066f174f..7d8581e4 100644 --- a/com32/lib/syslinux/cleanup.c +++ b/com32/lib/syslinux/cleanup.c @@ -29,8 +29,6 @@ #include <syslinux/config.h> #include <syslinux/pxe_api.h> #include <stddef.h> -#include <bios.h> -#include <com32.h> #include <core.h> void syslinux_final_cleanup(uint16_t flags) diff --git a/com32/lib/syslinux/dsinfo.c b/com32/lib/syslinux/dsinfo.c index c1f02a59..f7126bfe 100644 --- a/com32/lib/syslinux/dsinfo.c +++ b/com32/lib/syslinux/dsinfo.c @@ -34,12 +34,5 @@ union syslinux_derivative_info __syslinux_derivative_info; void __constructor __syslinux_get_derivative_info(void) { - com32sys_t *const r = &__syslinux_derivative_info.rr.r; - - r->eax.w[0] = 0x000A; - __intcall(0x22, r, r); - - __syslinux_derivative_info.r.esbx = MK_PTR(r->es, r->ebx.w[0]); - __syslinux_derivative_info.r.fssi = MK_PTR(r->fs, r->esi.w[0]); - __syslinux_derivative_info.r.gsdi = MK_PTR(r->gs, r->edi.w[0]); + get_derivative_info(&__syslinux_derivative_info); } diff --git a/com32/lib/syslinux/load_linux.c b/com32/lib/syslinux/load_linux.c index 04a52107..aea03058 100644 --- a/com32/lib/syslinux/load_linux.c +++ b/com32/lib/syslinux/load_linux.c @@ -47,48 +47,7 @@ #include <syslinux/linux.h> #include <syslinux/bootrm.h> #include <syslinux/movebits.h> - -struct linux_header { - uint8_t boot_sector_1[0x0020]; - uint16_t old_cmd_line_magic; - uint16_t old_cmd_line_offset; - uint8_t boot_sector_2[0x01f1 - 0x0024]; - uint8_t setup_sects; - uint16_t root_flags; - uint32_t syssize; - uint16_t ram_size; - uint16_t vid_mode; - uint16_t root_dev; - uint16_t boot_flag; - uint16_t jump; - uint32_t header; - uint16_t version; - uint32_t realmode_swtch; - uint16_t start_sys; - uint16_t kernel_version; - uint8_t type_of_loader; - uint8_t loadflags; - uint16_t setup_move_size; - uint32_t code32_start; - uint32_t ramdisk_image; - uint32_t ramdisk_size; - uint32_t bootsect_kludge; - uint16_t heap_end_ptr; - uint16_t pad1; - uint32_t cmd_line_ptr; - uint32_t initrd_addr_max; - uint32_t kernel_alignment; - uint8_t relocatable_kernel; - uint8_t pad2[3]; - uint32_t cmdline_max_len; - uint32_t hardware_subarch; - uint64_t hardware_subarch_data; - uint32_t payload_offset; - uint32_t payload_length; - uint64_t setup_data; - uint64_t pref_address; - uint32_t init_size; -} __packed; +#include <syslinux/firmware.h> #define BOOT_MAGIC 0xAA55 #define LINUX_MAGIC ('H' + ('d' << 8) + ('r' << 16) + ('S' << 24)) @@ -130,23 +89,6 @@ static inline uint32_t saturate32(unsigned long long v) return (v > 0xffffffff) ? 0xffffffff : (uint32_t) v; } -/* Get the combined size of the initramfs */ -static addr_t initramfs_size(struct initramfs *initramfs) -{ - struct initramfs *ip; - addr_t size = 0; - - if (!initramfs) - return 0; - - for (ip = initramfs->next; ip->len; ip = ip->next) { - size = (size + ip->align - 1) & ~(ip->align - 1); /* Alignment */ - size += ip->len; - } - - return size; -} - /* Create the appropriate mappings for the initramfs */ static int map_initramfs(struct syslinux_movelist **fraglist, struct syslinux_memmap **mmap, @@ -182,10 +124,10 @@ static int map_initramfs(struct syslinux_movelist **fraglist, return 0; } -int syslinux_boot_linux(void *kernel_buf, size_t kernel_size, - struct initramfs *initramfs, - struct setup_data *setup_data, - char *cmdline) +int bios_boot_linux(void *kernel_buf, size_t kernel_size, + struct initramfs *initramfs, + struct setup_data *setup_data, + char *cmdline) { struct linux_header hdr, *whdr; size_t real_mode_size, prot_mode_size; @@ -544,3 +486,17 @@ bail: syslinux_free_memmap(amap); return -1; } + +int syslinux_boot_linux(void *kernel_buf, size_t kernel_size, + struct initramfs *initramfs, + struct setup_data *setup_data, + char *cmdline) +{ + if (!firmware->boot_linux) { + printf("No linux boot function registered for firmware\n"); + return -1; + } + + firmware->boot_linux(kernel_buf, kernel_size, initramfs, + setup_data, cmdline); +} diff --git a/com32/lib/syslinux/memscan.c b/com32/lib/syslinux/memscan.c index fc676cbf..0ff25d7f 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->mem->scan_memory(callback, data); +} diff --git a/com32/lib/syslinux/serial.c b/com32/lib/syslinux/serial.c index aa5690fa..041e8505 100644 --- a/com32/lib/syslinux/serial.c +++ b/com32/lib/syslinux/serial.c @@ -32,24 +32,19 @@ */ #include <klibc/compiler.h> +#include <syslinux/firmware.h> #include <syslinux/config.h> #include <string.h> -#include <bios.h> -#include <core.h> struct syslinux_serial_console_info __syslinux_serial_console_info; void __syslinux_set_serial_console_info(void) { - uint16_t flowctl; + uint16_t iobase, divisor, flowctl; - __syslinux_serial_console_info.iobase = SerialPort; - __syslinux_serial_console_info.divisor = BaudDivisor; - - flowctl = FlowOutput | FlowInput | (FlowIgnore << 4); - - if (!DisplayCon) - flowctl |= (0x80 << 8); + firmware->get_serial_console_info(&iobase, &divisor, &flowctl); + __syslinux_serial_console_info.iobase = iobase; + __syslinux_serial_console_info.divisor = divisor; __syslinux_serial_console_info.flowctl = flowctl; } diff --git a/com32/lib/syslinux/shuffle.c b/com32/lib/syslinux/shuffle.c index 1dcdb9d0..ce85a5c4 100644 --- a/com32/lib/syslinux/shuffle.c +++ b/com32/lib/syslinux/shuffle.c @@ -50,10 +50,12 @@ struct shuffle_descriptor { static int shuffler_size; -static void __constructor __syslinux_get_shuffer_size(void) +static void __syslinux_get_shuffer_size(void) { - /* +15 padding is to guarantee alignment */ - shuffler_size = __bcopyxx_len + 15; + if (!shuffler_size) { + /* +15 padding is to guarantee alignment */ + shuffler_size = __bcopyxx_len + 15; + } } /* @@ -114,6 +116,7 @@ int syslinux_do_shuffle(struct syslinux_movelist *fraglist, if (!rxmap) goto bail; + __syslinux_get_shuffer_size(); desc_blocks = (nzero + DESC_BLOCK_SIZE - 1) / DESC_BLOCK_SIZE; for (;;) { /* We want (desc_blocks) allocation blocks, plus the terminating diff --git a/com32/lib/syslinux/version.c b/com32/lib/syslinux/version.c index 1cd2efd3..6f0554d5 100644 --- a/com32/lib/syslinux/version.c +++ b/com32/lib/syslinux/version.c @@ -28,7 +28,7 @@ #include <syslinux/config.h> #include <klibc/compiler.h> #include <core.h> -#include <../../../version.h> +#include <version.h> struct syslinux_version __syslinux_version; |