[syslinux:master] Fix all warnings, and better separate code that should not be mixed

syslinux-bot for H. Peter Anvin (Intel) hpa at zytor.com
Wed Feb 20 17:55:16 PST 2019


Commit-ID:  458a54133ecdf1685c02294d812cb562fe7bf4c3
Gitweb:     http://www.syslinux.org/commit/458a54133ecdf1685c02294d812cb562fe7bf4c3
Author:     H. Peter Anvin (Intel) <hpa at zytor.com>
AuthorDate: Thu, 7 Feb 2019 20:05:52 -0800
Committer:  H. Peter Anvin (Intel) <hpa at zytor.com>
CommitDate: Thu, 7 Feb 2019 20:05:52 -0800

Fix all warnings, and better separate code that should not be mixed

Clean up a number of warnings in the tree.

Refactor especially the core code so we don't end up building a bunch
of BIOS-specific code for EFI, and general build cleanups.

Signed-off-by: H. Peter Anvin (Intel) <hpa at zytor.com>

---
 com32/Makefile                                     |   7 +-
 com32/cmenu/libmenu/menu.c                         |   4 +-
 com32/elflink/ldlinux/chainboot.c                  |   2 +-
 com32/elflink/ldlinux/loadhigh.c                   |   4 +-
 com32/gpllib/dmi/dmi.c                             |   2 +-
 com32/hdt/hdt-cli-kernel.c                         |   3 +
 com32/include/syslinux/movebits.h                  |   2 +-
 com32/lib/libpng/pngrtran.c                        |   2 +
 com32/lib/onexit.c                                 |  18 +-
 com32/lib/pci/scan.c                               |  67 +++---
 com32/lib/sprintf.c                                |   3 +-
 com32/lib/sys/module/x86_64/elf_module.c           |   8 +-
 com32/lib/sys/vesa/screencpy.c                     |   2 +-
 com32/lib/syslinux/movebits.c                      |  34 +--
 com32/lib/syslinux/shuffle.c                       |  10 +-
 com32/lib/syslinux/zonelist.c                      |   2 +-
 com32/lib/vsprintf.c                               |   3 +-
 com32/libupload/upload_tftp.c                      |   2 +-
 com32/lua/src/cmenu.c                              |   1 +
 com32/mboot/map.c                                  |  12 +-
 com32/mboot/mem.c                                  |   2 +-
 com32/modules/pxechn.c                             |   4 +-
 com32/samples/hello.c                              |   3 +-
 core/Makefile                                      | 156 +++++-------
 core/{ => bios}/adv.inc                            |   0
 core/{ => bios}/bcopy32.inc                        |   0
 core/{ => bios}/bcopyxx.inc                        |   0
 core/{ => bios}/bios.c                             |   0
 core/{ => bios}/bios.inc                           |   0
 core/{ => bios}/call16.c                           |   0
 core/{ => bios}/callback.inc                       |   0
 core/{ => bios}/com32.inc                          |   0
 core/{ => bios}/common.inc                         |   0
 core/{ => bios}/config.inc                         |   0
 core/{ => bios}/conio.c                            |  21 --
 core/{ => bios}/diskboot.inc                       |   0
 core/{ => bios}/diskfs.inc                         |   0
 core/{fs => bios}/diskio_bios.c                    |   0
 core/{ => bios}/diskstart.inc                      |   0
 core/{ => bios}/extern.inc                         |   7 -
 core/{ => bios}/font.c                             |   0
 core/{ => bios}/graphics.c                         |   0
 core/{ => bios}/head.inc                           |   0
 core/{ => bios}/init.inc                           |   0
 core/{ => bios}/io.inc                             |   0
 core/{ => bios}/isolinux-c.c                       |   0
 core/bios/isolinux-debug-c.c                       |   1 +
 core/{ => bios}/isolinux-debug.asm                 |   0
 core/{ => bios}/isolinux.asm                       |   0
 core/{ => bios}/kaboom.c                           |   0
 core/{ => bios}/kernel.inc                         |   0
 core/{ => bios}/keywords.inc                       |   0
 core/{ => bios}/layout.inc                         |   0
 core/{ => bios}/ldlinux-c.c                        |   0
 core/{ => bios}/ldlinux.asm                        |   0
 core/{ => bios}/legacynet/core.c                   |   2 +-
 core/{ => bios}/legacynet/dnsresolv.c              |   2 +-
 core/{ => bios}/legacynet/idle.c                   |   2 +-
 core/{ => bios}/legacynet/portnum.c                |   2 +-
 core/{ => bios}/localboot.c                        |   3 +-
 core/{ => bios}/localboot.inc                      |   0
 core/bios/lpxelinux-c.c                            |   1 +
 core/bios/lpxelinux.asm                            |   2 +
 core/{ => bios}/lwip/CHANGELOG                     |   0
 core/{ => bios}/lwip/COPYING                       |   0
 core/{ => bios}/lwip/FILES                         |   0
 core/{ => bios}/lwip/README                        |   0
 core/{ => bios}/lwip/UPGRADING                     |   0
 core/{fs/pxe => bios/lwip}/core.c                  |   2 +-
 core/{fs/pxe => bios/lwip}/dnsresolv.c             |   2 +-
 core/{ => bios}/lwip/doc/FILES                     |   0
 core/{ => bios}/lwip/doc/contrib.txt               |   0
 core/{ => bios}/lwip/doc/rawapi.txt                |   0
 core/{ => bios}/lwip/doc/savannah.txt              |   0
 core/{ => bios}/lwip/doc/snmp_agent.txt            |   0
 core/{ => bios}/lwip/doc/sys_arch.txt              |   0
 core/{fs/pxe => bios/lwip}/isr.c                   |  15 +-
 core/{ => bios}/lwip/src/FILES                     |   0
 core/{ => bios}/lwip/src/api/api_lib.c             |   0
 core/{ => bios}/lwip/src/api/api_msg.c             |   0
 core/{ => bios}/lwip/src/api/err.c                 |   0
 core/{ => bios}/lwip/src/api/netbuf.c              |   0
 core/{ => bios}/lwip/src/api/netdb.c               |   0
 core/{ => bios}/lwip/src/api/netifapi.c            |   0
 core/{ => bios}/lwip/src/api/sockets.c             |   0
 core/{ => bios}/lwip/src/api/tcpip.c               |   0
 core/{ => bios}/lwip/src/arch/sys_arch.c           |   0
 core/{ => bios}/lwip/src/core/def.c                |   0
 core/{ => bios}/lwip/src/core/dhcp.c               |   0
 core/{ => bios}/lwip/src/core/dns.c                |   0
 core/{ => bios}/lwip/src/core/init.c               |   0
 core/{ => bios}/lwip/src/core/ipv4/autoip.c        |   0
 core/{ => bios}/lwip/src/core/ipv4/icmp.c          |   0
 core/{ => bios}/lwip/src/core/ipv4/igmp.c          |   0
 core/{ => bios}/lwip/src/core/ipv4/inet.c          |   0
 core/{ => bios}/lwip/src/core/ipv4/inet_chksum.c   |   0
 core/{ => bios}/lwip/src/core/ipv4/ip.c            |   0
 core/{ => bios}/lwip/src/core/ipv4/ip_addr.c       |   0
 core/{ => bios}/lwip/src/core/ipv4/ip_frag.c       |   0
 core/{ => bios}/lwip/src/core/mem.c                |   0
 core/{ => bios}/lwip/src/core/memp.c               |   0
 core/{ => bios}/lwip/src/core/netif.c              |   0
 core/{ => bios}/lwip/src/core/pbuf.c               |   0
 core/{ => bios}/lwip/src/core/raw.c                |   0
 core/{ => bios}/lwip/src/core/snmp/asn1_dec.c      |   0
 core/{ => bios}/lwip/src/core/snmp/asn1_enc.c      |   0
 core/{ => bios}/lwip/src/core/snmp/mib2.c          |   0
 core/{ => bios}/lwip/src/core/snmp/mib_structs.c   |   0
 core/{ => bios}/lwip/src/core/snmp/msg_in.c        |   0
 core/{ => bios}/lwip/src/core/snmp/msg_out.c       |   0
 core/{ => bios}/lwip/src/core/stats.c              |   0
 core/{ => bios}/lwip/src/core/sys.c                |   0
 core/{ => bios}/lwip/src/core/tcp.c                |   0
 core/{ => bios}/lwip/src/core/tcp_in.c             |   0
 core/{ => bios}/lwip/src/core/tcp_out.c            |   0
 core/{ => bios}/lwip/src/core/timers.c             |   0
 core/{ => bios}/lwip/src/core/udp.c                |   0
 core/{ => bios}/lwip/src/include/arch/cc.h         |   0
 core/{ => bios}/lwip/src/include/arch/perf.h       |   0
 core/{ => bios}/lwip/src/include/arch/sys_arch.h   |   0
 .../{ => bios}/lwip/src/include/ipv4/lwip/autoip.h |   0
 core/{ => bios}/lwip/src/include/ipv4/lwip/icmp.h  |   0
 core/{ => bios}/lwip/src/include/ipv4/lwip/igmp.h  |   0
 core/{ => bios}/lwip/src/include/ipv4/lwip/inet.h  |   0
 .../lwip/src/include/ipv4/lwip/inet_chksum.h       |   0
 core/{ => bios}/lwip/src/include/ipv4/lwip/ip.h    |   0
 .../lwip/src/include/ipv4/lwip/ip_addr.h           |   0
 .../lwip/src/include/ipv4/lwip/ip_frag.h           |   0
 core/{ => bios}/lwip/src/include/lwip/api.h        |   0
 core/{ => bios}/lwip/src/include/lwip/api_msg.h    |   0
 core/{ => bios}/lwip/src/include/lwip/arch.h       |   0
 core/{ => bios}/lwip/src/include/lwip/debug.h      |   0
 core/{ => bios}/lwip/src/include/lwip/def.h        |   0
 core/{ => bios}/lwip/src/include/lwip/dhcp.h       |   0
 core/{ => bios}/lwip/src/include/lwip/dns.h        |   0
 core/{ => bios}/lwip/src/include/lwip/err.h        |   0
 core/{ => bios}/lwip/src/include/lwip/init.h       |   0
 core/{ => bios}/lwip/src/include/lwip/mem.h        |   0
 core/{ => bios}/lwip/src/include/lwip/memp.h       |   0
 core/{ => bios}/lwip/src/include/lwip/memp_std.h   |   0
 core/{ => bios}/lwip/src/include/lwip/netbuf.h     |   0
 core/{ => bios}/lwip/src/include/lwip/netdb.h      |   0
 core/{ => bios}/lwip/src/include/lwip/netif.h      |   0
 core/{ => bios}/lwip/src/include/lwip/netifapi.h   |   0
 core/{ => bios}/lwip/src/include/lwip/opt.h        |   0
 core/{ => bios}/lwip/src/include/lwip/pbuf.h       |   0
 core/{ => bios}/lwip/src/include/lwip/raw.h        |   0
 core/{ => bios}/lwip/src/include/lwip/sio.h        |   0
 core/{ => bios}/lwip/src/include/lwip/snmp.h       |   0
 core/{ => bios}/lwip/src/include/lwip/snmp_asn1.h  |   0
 core/{ => bios}/lwip/src/include/lwip/snmp_msg.h   |   0
 .../lwip/src/include/lwip/snmp_structs.h           |   0
 core/{ => bios}/lwip/src/include/lwip/sockets.h    |   0
 core/{ => bios}/lwip/src/include/lwip/stats.h      |   0
 core/{ => bios}/lwip/src/include/lwip/sys.h        |   0
 core/{ => bios}/lwip/src/include/lwip/tcp.h        |   0
 core/{ => bios}/lwip/src/include/lwip/tcp_impl.h   |   0
 core/{ => bios}/lwip/src/include/lwip/tcpip.h      |   0
 core/{ => bios}/lwip/src/include/lwip/timers.h     |   0
 core/{ => bios}/lwip/src/include/lwip/udp.h        |   0
 core/{ => bios}/lwip/src/include/lwipopts.h        |   0
 core/{ => bios}/lwip/src/include/netif/etharp.h    |   0
 core/{ => bios}/lwip/src/include/netif/ppp_oe.h    |   0
 core/{ => bios}/lwip/src/include/netif/slipif.h    |   0
 core/{ => bios}/lwip/src/netif/FILES               |   0
 core/{ => bios}/lwip/src/netif/etharp.c            |   0
 core/{ => bios}/lwip/src/netif/ethernetif.c        |   0
 core/{ => bios}/lwip/src/netif/ppp/auth.c          |   0
 core/{ => bios}/lwip/src/netif/ppp/auth.h          |   0
 core/{ => bios}/lwip/src/netif/ppp/chap.c          |   0
 core/{ => bios}/lwip/src/netif/ppp/chap.h          |   0
 core/{ => bios}/lwip/src/netif/ppp/chpms.c         |   0
 core/{ => bios}/lwip/src/netif/ppp/chpms.h         |   0
 core/{ => bios}/lwip/src/netif/ppp/fsm.c           |   0
 core/{ => bios}/lwip/src/netif/ppp/fsm.h           |   0
 core/{ => bios}/lwip/src/netif/ppp/ipcp.c          |   0
 core/{ => bios}/lwip/src/netif/ppp/ipcp.h          |   0
 core/{ => bios}/lwip/src/netif/ppp/lcp.c           |   0
 core/{ => bios}/lwip/src/netif/ppp/lcp.h           |   0
 core/{ => bios}/lwip/src/netif/ppp/magic.c         |   0
 core/{ => bios}/lwip/src/netif/ppp/magic.h         |   0
 core/{ => bios}/lwip/src/netif/ppp/md5.c           |   0
 core/{ => bios}/lwip/src/netif/ppp/md5.h           |   0
 core/{ => bios}/lwip/src/netif/ppp/pap.c           |   0
 core/{ => bios}/lwip/src/netif/ppp/pap.h           |   0
 core/{ => bios}/lwip/src/netif/ppp/ppp.c           |   0
 core/{ => bios}/lwip/src/netif/ppp/ppp.h           |   0
 core/{ => bios}/lwip/src/netif/ppp/ppp_oe.c        |   0
 core/{ => bios}/lwip/src/netif/ppp/pppdebug.h      |   0
 core/{ => bios}/lwip/src/netif/ppp/randm.c         |   0
 core/{ => bios}/lwip/src/netif/ppp/randm.h         |   0
 core/{ => bios}/lwip/src/netif/ppp/vj.c            |   0
 core/{ => bios}/lwip/src/netif/ppp/vj.h            |   0
 core/{ => bios}/lwip/src/netif/slipif.c            |   0
 core/{ => bios}/lwip/src/netif/undiif.c            |   2 +-
 core/{fs/pxe => bios/lwip}/tcp.c                   |   2 +-
 core/{ => bios/lwip}/thread/exit_thread.c          |   0
 core/{ => bios/lwip}/thread/idle_thread.c          |   0
 core/{ => bios/lwip}/thread/kill_thread.c          |   0
 core/{ => bios/lwip}/thread/mbox.c                 |   0
 core/{ => bios/lwip}/thread/root_thread.c          |   0
 core/{ => bios/lwip}/thread/schedule.c             |   6 +-
 core/{ => bios/lwip}/thread/sem_asm.S              |   0
 core/{ => bios/lwip}/thread/semaphore.c            |   0
 core/{ => bios/lwip}/thread/start_thread.c         |   0
 core/{ => bios/lwip}/thread/thread_asm.S           |   0
 core/{ => bios/lwip}/thread/timeout.c              |   0
 core/{ => bios}/lzo/enter.ash                      |   0
 core/{ => bios}/lzo/leave.ash                      |   0
 core/{ => bios}/lzo/lzo1c_d.ash                    |   0
 core/{ => bios}/lzo/lzo1f_d.ash                    |   0
 core/{ => bios}/lzo/lzo1x_d.ash                    |   0
 core/{ => bios}/lzo/lzo1x_f2.S                     |   0
 core/{ => bios}/lzo/lzo_asm.h                      |   0
 core/{ => bios}/macros.inc                         |   0
 core/bios/null_thread.c                            |  18 ++
 core/{ => bios}/plaincon.c                         |   0
 core/{ => bios}/pm.inc                             |   0
 core/{ => bios}/pmcall.inc                         |   0
 core/{ => bios}/prefix.inc                         |   0
 core/{ => bios}/pxe.inc                            |   0
 core/{fs => bios}/pxe/bios.c                       |  30 ++-
 core/{ => bios/pxe}/pxeboot.c                      |   2 +-
 core/{ => bios}/pxeisr.inc                         |   0
 core/{ => bios}/pxelinux-c.c                       |   0
 core/bios/pxelinux.asm                             |   2 +
 core/{pxelinux.asm => bios/pxelinux.inc}           |   5 -
 core/{ => bios}/rawcon.c                           |   0
 core/{ => bios}/regdump.inc                        |   0
 core/{ => bios}/rllpack.c                          |   0
 core/{ => bios}/serirq.c                           |   0
 core/{ => bios}/stack.inc                          |   0
 core/{ => bios}/strcpy.inc                         |   0
 core/{i386 => bios}/syslinux.ld                    |   0
 core/{ => bios}/timer.inc                          |   0
 core/{ => bios}/tracers.inc                        |   0
 core/{ => bios}/writedec.inc                       |   0
 core/{ => bios}/writehex.inc                       |   0
 core/conio.c                                       | 265 ---------------------
 core/elflink/elfutils.h                            |  18 +-
 core/fs/ext2/ext2.c                                |   2 +-
 core/fs/ntfs/ntfs.c                                |   2 -
 core/fs/ntfs/ntfs.h                                |   3 -
 core/fs/pxe/dhcp_option.c                          |   5 +-
 core/fs/pxe/ftp.c                                  |   2 +-
 core/fs/pxe/ftp_readdir.c                          |   2 +-
 core/fs/pxe/gpxeurl.c                              |  11 +-
 core/fs/pxe/http.c                                 |   2 +-
 core/fs/pxe/http_readdir.c                         |   2 +-
 core/fs/pxe/idle.c                                 |  10 +-
 core/fs/pxe/pxe.c                                  |  29 +--
 core/fs/pxe/tftp.c                                 |   2 +-
 core/{fs/pxe/pxe.h => include/core_pxe.h}          |   0
 core/strcasecmp.c                                  |  11 -
 core/{ => tests}/hello.c                           |   0
 diag/geodsp/Makefile                               |   4 +-
 efi/Makefile                                       |  25 +-
 efi/main.c                                         |  11 +-
 efi/pxe.c                                          |   2 +-
 efi/tcp.c                                          |   2 +-
 efi/udp.c                                          |   2 +-
 mk/syslinux.mk                                     |  11 +-
 262 files changed, 292 insertions(+), 613 deletions(-)

diff --git a/com32/Makefile b/com32/Makefile
index 5efda1ce..1aed8c8c 100644
--- a/com32/Makefile
+++ b/com32/Makefile
@@ -1,5 +1,10 @@
 SUBDIRS = tools lib libutil gpllib libupload elflink/ldlinux modules mboot \
-	  menu samples elflink rosh cmenu hdt gfxboot sysdump lua/src chain
+	  menu samples elflink rosh cmenu lua/src
+
+ifneq ($(FWCLASS),EFI)
+# These tools are no applicable to EFI, or need serious porting
+SUBDIRS += hdt gfxboot sysdump chain
+endif
 
 .PHONY: subdirs $(SUBDIRS)
 subdirs: $(SUBDIRS)
diff --git a/com32/cmenu/libmenu/menu.c b/com32/cmenu/libmenu/menu.c
index 9b1e7ad0..7cd568aa 100644
--- a/com32/cmenu/libmenu/menu.c
+++ b/com32/cmenu/libmenu/menu.c
@@ -481,8 +481,8 @@ static pt_menuitem getmenuoption(pt_menu menu, uchar top, uchar left, uchar star
         if (tmp < curr)
             first = calc_first_early(menu, tmp);
         curr = tmp;
-        } else {
-        if (ms->keys_handler)   // Call extra keys handler
+        } else if (ms->keys_handler) {
+	    // Call extra keys handler
             ms->keys_handler(ms, menu->items[curr], asc);
 
             /* The handler may have changed the UI, reset it on exit */
diff --git a/com32/elflink/ldlinux/chainboot.c b/com32/elflink/ldlinux/chainboot.c
index 27d4618c..1b9217f5 100644
--- a/com32/elflink/ldlinux/chainboot.c
+++ b/com32/elflink/ldlinux/chainboot.c
@@ -61,7 +61,7 @@ void chainboot_file(const char *file, uint32_t type)
     reg.eax.l = max;
     reg.ebx.l = 0;
     reg.edx.w[0] = 0;
-    reg.edi.l = (uint32_t)buf;
+    reg.edi.l = (uintptr_t)buf;
     reg.ebp.l = -1;	/* XXX: limit? */
     reg.esi.w[0] = rv;
 
diff --git a/com32/elflink/ldlinux/loadhigh.c b/com32/elflink/ldlinux/loadhigh.c
index 0f2f8428..a13d58ff 100644
--- a/com32/elflink/ldlinux/loadhigh.c
+++ b/com32/elflink/ldlinux/loadhigh.c
@@ -54,8 +54,8 @@ void pm_load_high(com32sys_t *regs)
 
     bytes     = regs->eax.l;
     zero_mask = regs->edx.w[0];
-    buf       = (char *)regs->edi.l;
-    limit     = (char *)(regs->ebp.l & ~zero_mask);
+    buf       = (char *)(uintptr_t)regs->edi.l;
+    limit     = (char *)(uintptr_t)(regs->ebp.l & ~zero_mask);
     file      = handle_to_file(regs->esi.w[0]);
     fs        = file->fs;
 
diff --git a/com32/gpllib/dmi/dmi.c b/com32/gpllib/dmi/dmi.c
index 7613383f..b94a71fb 100644
--- a/com32/gpllib/dmi/dmi.c
+++ b/com32/gpllib/dmi/dmi.c
@@ -1009,7 +1009,7 @@ void parse_dmitable(s_dmi * dmi)
     int i = 0;
     uint8_t *data = NULL;
     uint8_t buf[dmi->dmitable.len];
-    memcpy(buf, (int *)dmi->dmitable.base, sizeof(uint8_t) * dmi->dmitable.len);
+    memcpy(buf, (uint8_t *)(uintptr_t)dmi->dmitable.base, dmi->dmitable.len);
     data = buf;
     dmi->memory_count = 0;
     while (i < dmi->dmitable.num && data + 4 <= buf + dmi->dmitable.len) {	/* 4 is the length of an SMBIOS structure header */
diff --git a/com32/hdt/hdt-cli-kernel.c b/com32/hdt/hdt-cli-kernel.c
index 0160bed9..9b7ff49b 100644
--- a/com32/hdt/hdt-cli-kernel.c
+++ b/com32/hdt/hdt-cli-kernel.c
@@ -34,6 +34,9 @@
 #include "hdt-cli.h"
 #include "hdt-common.h"
 
+/* False positive warning in this file */
+#pragma GCC diagnostic ignored "-Wsizeof-pointer-memaccess"
+
 void main_show_kernel(int argc __unused, char **argv __unused,
 		      struct s_hardware *hardware)
 {
diff --git a/com32/include/syslinux/movebits.h b/com32/include/syslinux/movebits.h
index 4a4ce9ef..4f8392f3 100644
--- a/com32/include/syslinux/movebits.h
+++ b/com32/include/syslinux/movebits.h
@@ -5,7 +5,7 @@
 #include <stdio.h>
 #include <stdbool.h>
 
-typedef uint32_t addr_t;
+typedef uintptr_t addr_t;
 
 /*
  * A syslinux_movelist is a linked list of move operations.  The ordering
diff --git a/com32/lib/libpng/pngrtran.c b/com32/lib/libpng/pngrtran.c
index ccc58ce6..f8dcccf1 100644
--- a/com32/lib/libpng/pngrtran.c
+++ b/com32/lib/libpng/pngrtran.c
@@ -4215,6 +4215,8 @@ png_do_expand_palette(png_structrp png_ptr, png_row_infop row_info,
    png_uint_32 i;
    png_uint_32 row_width=row_info->width;
 
+   (void)png_ptr;
+
    png_debug(1, "in png_do_expand_palette");
 
    if (row_info->color_type == PNG_COLOR_TYPE_PALETTE)
diff --git a/com32/lib/onexit.c b/com32/lib/onexit.c
index 272f8f1c..8c45e3b4 100644
--- a/com32/lib/onexit.c
+++ b/com32/lib/onexit.c
@@ -4,21 +4,9 @@
 
 #include <stdlib.h>
 #include <unistd.h>
+#include <sys/module.h>
 #include "atexit.h"
 
-static struct atexit *__atexit_list;
-
-static __noreturn on_exit_exit(int rv)
-{
-    struct atexit *ap;
-
-    for (ap = __atexit_list; ap; ap = ap->next) {
-	ap->fctn(rv, ap->arg);	/* This assumes extra args are harmless */
-    }
-
-    _exit(rv);
-}
-
 int on_exit(void (*fctn) (int, void *), void *arg)
 {
     struct atexit *as = malloc(sizeof(struct atexit));
@@ -29,8 +17,8 @@ int on_exit(void (*fctn) (int, void *), void *arg)
     as->fctn = fctn;
     as->arg = arg;
 
-    as->next = __atexit_list;
-    __atexit_list = as;
+    as->next = __syslinux_current->u.x.atexit_list;
+    __syslinux_current->u.x.atexit_list = as;
 
     return 0;
 }
diff --git a/com32/lib/pci/scan.c b/com32/lib/pci/scan.c
index 20a3e2a6..12301277 100644
--- a/com32/lib/pci/scan.c
+++ b/com32/lib/pci/scan.c
@@ -650,46 +650,45 @@ int get_module_name_from_alias(struct pci_domain *domain, char *modules_alias_pa
 
     /* looking for the next field */
     result = strtok(line+strlen("alias pci:v"), delims);
-    while( result != NULL ) {
-	if (field==0) {
-
-		/* Searching for the vendor separator*/
-		char *temp = strstr(result,"d");
-		if (temp != NULL) {
-			strlcpy(vendor_id,result,temp-result);
-			result+=strlen(vendor_id)+1;
-		}
+    while (result) {
+	if (!field) {
+	    /* Searching for the vendor separator*/
+	    char *temp = strstr(result,"d");
+	    if (temp != NULL) {
+		strlcpy(vendor_id,result,temp-result);
+		result+=strlen(vendor_id)+1;
+	    }
 
-		/* Searching for the product separator*/
-		temp = strstr(result,"sv");
-		if (temp != NULL) {
-			strlcpy(product_id,result,temp-result);
-			result+=strlen(product_id)+1;
-		}
+	    /* Searching for the product separator*/
+	    temp = strstr(result,"sv");
+	    if (temp != NULL) {
+		strlcpy(product_id,result,temp-result);
+		result+=strlen(product_id)+1;
+	    }
 
-		/* Searching for the sub vendor separator*/
-		temp = strstr(result,"sd");
-		if (temp != NULL) {
-			strlcpy(sub_vendor_id,result,temp-result);
-			result+=strlen(sub_vendor_id)+1;
-		}
+	    /* Searching for the sub vendor separator*/
+	    temp = strstr(result,"sd");
+	    if (temp != NULL) {
+		strlcpy(sub_vendor_id,result,temp-result);
+		result+=strlen(sub_vendor_id)+1;
+	    }
 
-		/* Searching for the sub product separator*/
-		temp = strstr(result,"bc");
-		if (temp != NULL) {
-			strlcpy(sub_product_id,result,temp-result);
-			result+=strlen(sub_product_id)+1;
-		}
-	/* That's the module name */
-	} else if ((strlen(result)>2) &&
-			(result[0]==0x20))
-		strcpy(module_name,result+1);
-		/* We have to replace \n by \0*/
-		module_name[strlen(module_name)-1]='\0';
+	    /* Searching for the sub product separator*/
+	    temp = strstr(result,"bc");
+	    if (temp != NULL) {
+		strlcpy(sub_product_id,result,temp-result);
+		result+=strlen(sub_product_id)+1;
+	    }
+	} else if (strlen(result) > 2 && result[0] == ' ') {
+	    /* That is the module name */
+	    strcpy(module_name,result+1);
+	    /* We have to replace \n by \0*/
+	    module_name[strlen(module_name)-1] = '\0';
+	}
 	field++;
 
 	/* Searching the next field */
-        result = strtok( NULL, delims );
+        result = strtok(NULL, delims);
     }
 
     /* Now we have extracted informations from the modules.alias
diff --git a/com32/lib/sprintf.c b/com32/lib/sprintf.c
index 3c328410..d00274e0 100644
--- a/com32/lib/sprintf.c
+++ b/com32/lib/sprintf.c
@@ -4,6 +4,7 @@
 
 #include <stdio.h>
 #include <unistd.h>
+#include <limits.h>
 
 int sprintf(char *buffer, const char *format, ...)
 {
@@ -11,7 +12,7 @@ int sprintf(char *buffer, const char *format, ...)
     int rv;
 
     va_start(ap, format);
-    rv = vsnprintf(buffer, ~(size_t) 0, format, ap);
+    rv = vsnprintf(buffer, INT_MAX, format, ap);
     va_end(ap);
 
     return rv;
diff --git a/com32/lib/sys/module/x86_64/elf_module.c b/com32/lib/sys/module/x86_64/elf_module.c
index dd24bd12..aa89d928 100644
--- a/com32/lib/sys/module/x86_64/elf_module.c
+++ b/com32/lib/sys/module/x86_64/elf_module.c
@@ -241,7 +241,7 @@ int perform_relocation(struct elf_module *module, Elf_Rel *rel) {
 		*dest += sym_addr;
 		break;
 	case R_X86_64_PC32:
-		*dest += sym_addr - (Elf32_Addr)dest;
+	        *(uint32_t *)dest += sym_addr - (Elf64_Addr)dest;
 		break;
 	case R_X86_64_COPY:
 		if (sym_addr > 0) {
@@ -338,7 +338,7 @@ int resolve_symbols(struct elf_module *module) {
 	if (rel_size > 0) {
 		// Process standard relocations
 		for (i = 0; i < rel_size/rel_entry; i++) {
-			crt_rel = (Elf64_Rel*)(rel + i*rel_entry);
+		    crt_rel = (Elf64_Rel*)((char *)rel + i*rel_entry);
 
 			res = perform_relocation(module, crt_rel);
 
@@ -351,7 +351,7 @@ int resolve_symbols(struct elf_module *module) {
 	if (rela_size > 0) {
 		// Process standard relocations
 		for (i = 0; i < rela_size/rela_entry; i++) {
-			crt_rel = (Elf64_Rel*)(rel + i*rela_entry);
+		    crt_rel = (Elf64_Rel*)((char *)rel + i*rela_entry);
 
 			res = perform_relocation(module, crt_rel);
 
@@ -367,7 +367,7 @@ int resolve_symbols(struct elf_module *module) {
 		//for (i = 0; i < plt_rel_size/sizeof(Elf64_Rel); i++) {
 		for (i = 0; i < plt_rel_size/rela_entry; i++) {
 			//crt_rel = (Elf64_Rel*)(plt_rel + i*sizeof(Elf64_Rel));
-			crt_rel = (Elf64_Rel*)(plt_rel + i*rela_entry);
+		        crt_rel = (Elf64_Rel*)((char *)plt_rel + i*rela_entry);
 
 			res = perform_relocation(module, crt_rel);
 
diff --git a/com32/lib/sys/vesa/screencpy.c b/com32/lib/sys/vesa/screencpy.c
index d78109bc..bc53b5b5 100644
--- a/com32/lib/sys/vesa/screencpy.c
+++ b/com32/lib/sys/vesa/screencpy.c
@@ -59,7 +59,7 @@ void __vesacon_init_copy_to_screen(void)
 	    winn = 1;
 
 	wi.win_num = winn;
-	wi.win_base = (char *)(mi->win_seg[winn] << 4);
+	wi.win_base = (char *)(uintptr_t)(mi->win_seg[winn] << 4);
 	wi.win_size = mi->win_size << 10;
 	wi.win_gshift = ilog2(mi->win_grain) + 10;
 	wi.win_pos = -1;	/* Undefined position */
diff --git a/com32/lib/syslinux/movebits.c b/com32/lib/syslinux/movebits.c
index 24cb74ee..03758c98 100644
--- a/com32/lib/syslinux/movebits.c
+++ b/com32/lib/syslinux/movebits.c
@@ -152,7 +152,7 @@ static const struct syslinux_memmap *is_free_zone(const struct syslinux_memmap
 {
     addr_t last, llast;
 
-    dprintf("f: 0x%08x bytes at 0x%08x\n", len, start);
+    dprintf("f: 0x%08zx bytes at 0x%08zx\n", len, start);
 
     last = start + len - 1;
 
@@ -238,11 +238,11 @@ static void shuffle_dealias(struct syslinux_movelist **fraglist,
      */
     mpp = fraglist;
     while ((mp = *mpp)) {
-	dprintf("mp -> (%#x,%#x,%#x)\n", mp->dst, mp->src, mp->len);
+	dprintf("mp -> (%#zx,%#zx,%#zx)\n", mp->dst, mp->src, mp->len);
 	ps = mp->src;
 	pe = mp->src + mp->len - 1;
 	for (mx = *fraglist; mx != mp; mx = mx->next) {
-	    dprintf("mx -> (%#x,%#x,%#x)\n", mx->dst, mx->src, mx->len);
+	    dprintf("mx -> (%#zx,%#zx,%#zx)\n", mx->dst, mx->src, mx->len);
 	    /*
 	     * If there is any overlap between mx and mp, mp should be
 	     * modified and possibly split.
@@ -250,7 +250,7 @@ static void shuffle_dealias(struct syslinux_movelist **fraglist,
 	    xs = mx->src;
 	    xe = mx->src + mx->len - 1;
 
-	    dprintf("?: %#x..%#x (inside %#x..%#x)\n", ps, pe, xs, xe);
+	    dprintf("?: %#zx..%#zx (inside %#zx..%#zx)\n", ps, pe, xs, xe);
 
 	    if (pe <= xs || ps >= xe)
 		continue;	/* No overlap */
@@ -282,7 +282,7 @@ static void shuffle_dealias(struct syslinux_movelist **fraglist,
 
 	    assert(ps >= xs && pe <= xe);
 
-	    dprintf("Overlap: %#x..%#x (inside %#x..%#x)\n", ps, pe, xs, xe);
+	    dprintf("Overlap: %#zx..%#zx (inside %#zx..%#zx)\n", ps, pe, xs, xe);
 
 	    mp->src = mx->dst + (ps - xs);
 	    mp->next = *postcopy;
@@ -335,7 +335,7 @@ move_chunk(struct syslinux_movelist ***moves,
     copydst = f->dst;
     copysrc = f->src;
 
-    dprintf("Q: copylen = 0x%08x, needlen = 0x%08x\n", copylen, needlen);
+    dprintf("Q: copylen = 0x%08zx, needlen = 0x%08zx\n", copylen, needlen);
 
     if (copylen < needlen) {
 	if (reverse) {
@@ -343,7 +343,7 @@ move_chunk(struct syslinux_movelist ***moves,
 	    copysrc += (f->len - copylen);
 	}
 
-	dprintf("X: 0x%08x bytes at 0x%08x -> 0x%08x\n",
+	dprintf("X: 0x%08zx bytes at 0x%08zx -> 0x%08zx\n",
 		copylen, copysrc, copydst);
 
 	/* Didn't get all we wanted, so we have to split the chunk */
@@ -352,7 +352,8 @@ move_chunk(struct syslinux_movelist ***moves,
     }
 
     mv = new_movelist(f->dst, f->src, f->len);
-    dprintf("A: 0x%08x bytes at 0x%08x -> 0x%08x\n", mv->len, mv->src, mv->dst);
+    dprintf("A: 0x%08zx bytes at 0x%08zx -> 0x%08zx\n",
+	    mv->len, mv->src, mv->dst);
     **moves = mv;
     *moves = &mv->next;
 
@@ -368,7 +369,8 @@ move_chunk(struct syslinux_movelist ***moves,
 	freebase = f->dst + f->len;
     }
 
-    dprintf("F: 0x%08x bytes at 0x%08x\n", freelen, freebase);
+    dprintf("F: 0x%08zx bytes at 0x%08zx\n",
+	    freelen, freebase);
 
     add_freelist(mmap, freebase, freelen, SMT_FREE);
 
@@ -472,7 +474,7 @@ nomem:
 
 	    if (is_free_zone(mmap, needbase, needlen)) {
 		fp = op, f = o;
-		dprintf("!: 0x%08x bytes at 0x%08x -> 0x%08x\n",
+		dprintf("!: 0x%08zx bytes at 0x%08zx -> 0x%08zx\n",
 			f->len, f->src, f->dst);
 		copysrc = f->src;
 		copylen = needlen;
@@ -483,7 +485,7 @@ nomem:
 
 	/* Ok, bother.  Need to do real work at least with one chunk. */
 
-	dprintf("@: 0x%08x bytes at 0x%08x -> 0x%08x\n",
+	dprintf("@: 0x%08zx bytes at 0x%08zx -> 0x%08zx\n",
 		f->len, f->src, f->dst);
 
 	/* See if we can move this chunk into place by claiming
@@ -509,8 +511,8 @@ nomem:
 	    cbyte = f->dst;
 	}
 
-	dprintf("need: base = 0x%08x, len = 0x%08x, "
-		"reverse = %d, cbyte = 0x%08x\n",
+	dprintf("need: base = 0x%08zx, len = 0x%08zx, "
+		"reverse = %d, cbyte = 0x%08zx\n",
 		needbase, needlen, reverse, cbyte);
 
 	ep = is_free_zone(mmap, cbyte, 1);
@@ -527,7 +529,7 @@ nomem:
 	if (avail) {
 	    /* We can move at least part of this chunk into place without
 	       further ado */
-	    dprintf("space: start 0x%08x, len 0x%08x, free 0x%08x\n",
+	    dprintf("space: start 0x%08zx, len 0x%08zx, free 0x%08zx\n",
 		    ep->start, ep_len, avail);
 	    copylen = min(needlen, avail);
 
@@ -545,7 +547,7 @@ nomem:
 	   Then move a chunk of ourselves into place. */
 	for (op = &f->next, o = *op; o; op = &o->next, o = *op) {
 
-	    dprintf("O: 0x%08x bytes at 0x%08x -> 0x%08x\n",
+	    dprintf("O: 0x%08zx bytes at 0x%08zx -> 0x%08zx\n",
 		    o->len, o->src, o->dst);
 
 	    if (!(o->src <= cbyte && o->src + o->len > cbyte))
@@ -588,7 +590,7 @@ nomem:
 	    }
 
 	    mv = new_movelist(copydst, copysrc, copylen);
-	    dprintf("C: 0x%08x bytes at 0x%08x -> 0x%08x\n",
+	    dprintf("C: 0x%08zx bytes at 0x%08zx -> 0x%08zx\n",
 		    mv->len, mv->src, mv->dst);
 	    *moves = mv;
 	    moves = &mv->next;
diff --git a/com32/lib/syslinux/shuffle.c b/com32/lib/syslinux/shuffle.c
index 4f9c22b7..0f6042f9 100644
--- a/com32/lib/syslinux/shuffle.c
+++ b/com32/lib/syslinux/shuffle.c
@@ -46,7 +46,7 @@
 #include <syslinux/boot.h>
 
 struct shuffle_descriptor {
-    uint32_t dst, src, len;
+    addr_t dst, src, len;
 };
 
 /*
@@ -105,7 +105,7 @@ int syslinux_do_shuffle(struct syslinux_movelist *fraglist,
 
     syslinux_free_memmap(rxmap);
 
-    dprintf("desczone = 0x%08x, descfree = 0x%08x\n", desczone, descfree);
+    dprintf("desczone = 0x%08zx, descfree = 0x%08zx\n", desczone, descfree);
 
     rxmap = syslinux_dup_memmap(memmap);
     if (!rxmap)
@@ -165,7 +165,7 @@ int syslinux_do_shuffle(struct syslinux_movelist *fraglist,
     {
 	addr_t descoffs = descaddr - (addr_t) dbuf;
 
-	dprintf("nmoves = %d, nzero = %d, dbuf = %p, offs = 0x%08x\n",
+	dprintf("nmoves = %d, nzero = %d, dbuf = %p, offs = 0x%08zx\n",
 		nmoves, nzero, dbuf, descoffs);
     }
 #endif
@@ -177,7 +177,7 @@ int syslinux_do_shuffle(struct syslinux_movelist *fraglist,
 	dp->dst = mp->dst;
 	dp->src = mp->src;
 	dp->len = mp->len;
-	dprintf2("[ %08x %08x %08x ]\n", dp->dst, dp->src, dp->len);
+	dprintf2("[ %08zx %08zx %08zx ]\n", dp->dst, dp->src, dp->len);
 	dp++;
 	np++;
     }
@@ -188,7 +188,7 @@ int syslinux_do_shuffle(struct syslinux_movelist *fraglist,
 	    dp->dst = ml->start;
 	    dp->src = (addr_t) - 1;	/* bzero region */
 	    dp->len = ml->next->start - ml->start;
-	    dprintf2("[ %08x %08x %08x ]\n", dp->dst, dp->src, dp->len);
+	    dprintf2("[ %08zx %08zx %08zx ]\n", dp->dst, dp->src, dp->len);
 	    dp++;
 	    np++;
 	}
diff --git a/com32/lib/syslinux/zonelist.c b/com32/lib/syslinux/zonelist.c
index dbc874c5..b16fba01 100644
--- a/com32/lib/syslinux/zonelist.c
+++ b/com32/lib/syslinux/zonelist.c
@@ -148,7 +148,7 @@ int syslinux_add_memmap(struct syslinux_memmap **list,
 	}
     }
 
-    dprintf("After adding (%#x,%#x,%d):\n", start, len, type);
+    dprintf("After adding (%#zx,%#zx,%d):\n", start, len, type);
     syslinux_dump_memmap(*list);
 
     return 0;
diff --git a/com32/lib/vsprintf.c b/com32/lib/vsprintf.c
index 8df62130..270dc1b5 100644
--- a/com32/lib/vsprintf.c
+++ b/com32/lib/vsprintf.c
@@ -4,8 +4,9 @@
 
 #include <stdio.h>
 #include <unistd.h>
+#include <limits.h>
 
 int vsprintf(char *buffer, const char *format, va_list ap)
 {
-    return vsnprintf(buffer, ~(size_t) 0, format, ap);
+    return vsnprintf(buffer, INT_MAX, format, ap);
 }
diff --git a/com32/libupload/upload_tftp.c b/com32/libupload/upload_tftp.c
index 1e0b0702..151b96a6 100644
--- a/com32/libupload/upload_tftp.c
+++ b/com32/libupload/upload_tftp.c
@@ -8,7 +8,7 @@
 #include <syslinux/config.h>
 #include <netinet/in.h>
 #include <sys/times.h>
-#include <fs/pxe/pxe.h>
+#include <core_pxe.h>
 #include <fs/pxe/url.h>
 #include <fs/pxe/tftp.h>
 #include "upload_backend.h"
diff --git a/com32/lua/src/cmenu.c b/com32/lua/src/cmenu.c
index 1b128618..2903e0b7 100644
--- a/com32/lua/src/cmenu.c
+++ b/com32/lua/src/cmenu.c
@@ -41,6 +41,7 @@ static int l_add_item (lua_State *L)
 
 static int l_add_sep (lua_State *L)
 {
+  (void)L;
   add_sep ();
   return 0; /* FIXME return menuitem for advanced functions */
 }
diff --git a/com32/mboot/map.c b/com32/mboot/map.c
index 97b5b5d7..41024f92 100644
--- a/com32/mboot/map.c
+++ b/com32/mboot/map.c
@@ -61,7 +61,7 @@ addr_t map_data(const void *data, size_t len, size_t align, int flags)
 	return 0;
     }
 
-    dprintf("Mapping 0x%08zx bytes (%#x pad) at 0x%08x\n", len, pad, start);
+    dprintf("Mapping 0x%08zx bytes (%#zx pad) at 0x%08zx\n", len, pad, start);
 
     if (start + len + pad > mboot_high_water_mark)
 	mboot_high_water_mark = start + len + pad;
@@ -200,12 +200,12 @@ struct multiboot_header *map_image(void *ptr, size_t len)
 		    && eh->e_entry < ph->p_vaddr + msize)
 		    regs.eip = eh->e_entry + (ph->p_paddr - ph->p_vaddr);
 
-		dprintf("Segment at 0x%08x data 0x%08x len 0x%08x\n",
+		dprintf("Segment at 0x%08zx data 0x%08zx len 0x%08zx\n",
 			addr, dsize, msize);
 
 		if (syslinux_memmap_type(amap, addr, msize) != SMT_FREE) {
 		    printf
-			("Memory segment at 0x%08x (len 0x%08x) is unavailable\n",
+			("Memory segment at 0x%08zx (len 0x%08zx) is unavailable\n",
 			 addr, msize);
 		    return NULL;	/* Memory region unavailable */
 		}
@@ -306,12 +306,12 @@ struct multiboot_header *map_image(void *ptr, size_t len)
 		    && eh64->e_entry < ph64->p_vaddr + msize)
 		    regs.eip = eh64->e_entry + (ph64->p_paddr - ph64->p_vaddr);
 
-		dprintf("Segment at 0x%08x data 0x%08x len 0x%08x\n",
+		dprintf("Segment at 0x%08zx data 0x%08zx len 0x%08zx\n",
 			addr, dsize, msize);
 
 		if (syslinux_memmap_type(amap, addr, msize) != SMT_FREE) {
 		    printf
-			("Memory segment at 0x%08x (len 0x%08x) is unavailable\n",
+			("Memory segment at 0x%08zx (len 0x%08zx) is unavailable\n",
 			 addr, msize);
 		    return NULL;	/* Memory region unavailable */
 		}
@@ -414,7 +414,7 @@ struct multiboot_header *map_image(void *ptr, size_t len)
 
 	if (syslinux_memmap_type(amap, mbh->load_addr, data_len + bss_len)
 	    != SMT_FREE) {
-	    printf("Memory segment at 0x%08x (len 0x%08x) is unavailable\n",
+	    printf("Memory segment at 0x%08x (len 0x%08zx) is unavailable\n",
 		   mbh->load_addr, data_len + bss_len);
 	    return NULL;		/* Memory region unavailable */
 	}
diff --git a/com32/mboot/mem.c b/com32/mboot/mem.c
index d5c559a7..738291e5 100644
--- a/com32/mboot/mem.c
+++ b/com32/mboot/mem.c
@@ -169,7 +169,7 @@ out:
 void mboot_make_memmap(void)
 {
     int i, nmap;
-    struct AddrRangeDesc *ard;
+    struct AddrRangeDesc *ard = NULL;
     uint32_t lowmem, highmem;
     uint32_t highrsvd;
 
diff --git a/com32/modules/pxechn.c b/com32/modules/pxechn.c
index e4e21e88..0e646a4e 100644
--- a/com32/modules/pxechn.c
+++ b/com32/modules/pxechn.c
@@ -735,9 +735,11 @@ int pxechn_uuid_set(struct pxelinux_opt *pxe)
 	return -ret;	/* dhcp_unpack_packet always returns positive errors */
     }
 
-    if (pxe->opts[0][97].len >= 0 )
+    if (pxe->opts[0][97].len >= 0) {
 	pxechn_setopt(&(pxe->opts[2][97]), pxe->opts[0][97].data, pxe->opts[0][97].len);
 	return 1;
+    }
+
     return 0;
 }
 
diff --git a/com32/samples/hello.c b/com32/samples/hello.c
index d3d4d299..8ab00984 100644
--- a/com32/samples/hello.c
+++ b/com32/samples/hello.c
@@ -18,7 +18,8 @@ int main(int argc __unused, char **argv __unused)
     int *nums = NULL;
 
     nums = malloc(NUM_COUNT * sizeof(int));
-    printf("Hello, world, from 0x%08X! malloc return %p\n", (unsigned int)&main, nums);
+    printf("Hello, world, from %p! malloc return %p\n",
+	   (const void *)&main, nums);
 
     free(nums);
 
diff --git a/core/Makefile b/core/Makefile
index 50ff35af..fc608e51 100644
--- a/core/Makefile
+++ b/core/Makefile
@@ -25,8 +25,10 @@ include $(MAKEDIR)/embedded.mk
 -include $(objdir)/version.mk
 
 OPTFLAGS =
-INCLUDES = -I$(SRC)/include -I$(com32)/include -I$(com32)/include/sys -I$(com32)/lib \
-	-I$(SRC)/lwip/src/include -I$(SRC)/lwip/src/include/ipv4 -I$(SRC)/fs/pxe
+INCLUDES = -I$(SRC)/include -I$(com32)/include -I$(com32)/include/sys \
+	   -I$(com32)/lib \
+	   -I$(SRC)/bios/lwip/src/include \
+	   -I$(SRC)/bios/lwip/src/include/ipv4 -I$(SRC)/fs/pxe
 
 # This is very similar to cp437; technically it's for Norway and Denmark,
 # but it's unlikely the characters that are different will be used in
@@ -34,13 +36,12 @@ INCLUDES = -I$(SRC)/include -I$(com32)/include -I$(com32)/include/sys -I$(com32)
 CODEPAGE = cp865
 
 # The targets to build in this directory...
-BTARGET  = kwdhash.gen \
-	   ldlinux.bss ldlinux.sys ldlinux.bin \
+BTARGET  = kwdhash.gen ldlinux.bss ldlinux.sys \
 	   isolinux.bin isolinux-debug.bin pxelinux.0 lpxelinux.0
 
 # All primary source files for the main syslinux files
-NASMSRC	 := $(sort $(wildcard $(SRC)/*.asm))
-NASMHDR  := $(sort $(wildcard $(SRC)/*.inc))
+NASMSRC	 := $(sort $(shell find $(SRC) -name '*.asm' -print))
+NASMHDR	 := $(sort $(shell find $(SRC) -name '*.inc' -print))
 CSRC	 := $(sort $(shell find $(SRC) -name '*.c' -print))
 SSRC	 := $(sort $(shell find $(SRC) -name '*.S' -print))
 CHDR	 := $(sort $(shell find $(SRC) -name '*.h' -print))
@@ -52,50 +53,35 @@ SOBJ	 := $(subst $(SRC)/,,$(patsubst %.S,%.o,$(SSRC)))
 
 # To make this compatible with the following $(filter-out), make sure
 # we prefix everything with $(SRC)
-CORE_PXE_CSRC = \
-	$(addprefix $(SRC)/fs/pxe/, dhcp_option.c pxe.c tftp.c urlparse.c bios.c)
-
-LPXELINUX_CSRC = $(CORE_PXE_CSRC) \
-	$(sort $(shell find $(SRC)/lwip -name '*.c' -print)) \
-	$(addprefix $(SRC)/fs/pxe/, \
-		core.c dnsresolv.c ftp.c ftp_readdir.c gpxeurl.c http.c \
-		http_readdir.c idle.c isr.c tcp.c)
-
-PXELINUX_CSRC = $(CORE_PXE_CSRC) \
-	$(sort $(shell find $(SRC)/legacynet -name '*.c' -print))
-
-LPXELINUX_OBJS = $(subst $(SRC)/,,$(LPXELINUX_CSRC:%.c=%.o))
-PXELINUX_OBJS  = $(subst $(SRC)/,,$(PXELINUX_CSRC:%.c=%.o))
-
-UNITTEST_CSRC = $(shell find $(SRC) -path '*/tests/*.c' -print)
-UNITTEST_OBJS = $(subst $(SRC)/,,$(UNITTEST_CSRC:%.c=%.o))
-
-# Don't include console and network stack specific objects or unit tests
-FILTER_OBJS = %rawcon.o %plaincon.o %pxelinux-c.o %ldlinux-c.o \
-	%isolinux-c.o %localboot.o %pxeboot.o \
-	$(subst $(OBJ)/,,$(UNITTEST_OBJS)) \
-	$(subst $(OBJ)/,,$(LPXELINUX_OBJS)) \
-	$(subst $(OBJ)/,,$(PXELINUX_OBJS))
-
+CORE_PXE_DIRS  = $(SRC)/bios/pxe
+LPXELINUX_DIRS = $(SRC)/bios/lwip
+PXELINUX_DIRS  = $(SRC)/bios/legacynet
+
+CORE_PXE_CSRC  = $(sort $(shell find $(CORE_PXE_DIRS)  -name '*.c' -print))
+CORE_PXE_SSRC  = $(sort $(shell find $(CORE_PXE_DIRS)  -name '*.S' -print))
+LPXELINUX_CSRC = $(sort $(shell find $(LPXELINUX_DIRS) -name '*.c' -print))
+LPXELINUX_SSRC = $(sort $(shell find $(LPXELINUX_DIRS) -name '*.S' -print))
+PXELINUX_CSRC  = $(sort $(shell find $(PXELINUX_DIRS)  -name '*.c' -print))
+PXELINUX_SSRC  = $(sort $(shell find $(PXELINUX_DIRS)  -name '*.S' -print))
+
+CORE_PXE_OBJS  = $(subst $(SRC)/,,$(CORE_PXE_CSRC:%.c=%.o)  $(CORE_PXE_SSRC:%.S=%.o))
+LPXELINUX_OBJS = $(subst $(SRC)/,,$(LPXELINUX_CSRC:%.c=%.o) $(LPXELINUX_SSRC:%.S=%.o))
+PXELINUX_OBJS  = $(subst $(SRC)/,,$(PXELINUX_CSRC:%.c=%.o)  $(PXELINUX_SSRC:%.S=%.o))
+
+UNITTEST_DIRS = $(sort $(shell find $(SRC) -type d -name tests))
+
+# Don't include network stack specific objects or unit tests
+FILTER_DIRS = $(UNITTEST_DIRS) $(CORE_PXE_DIRS) \
+	      $(PXELINUX_DIRS) $(LPXELINUX_DIRS)
 ifeq ($(FWCLASS),EFI)
-# EFI is single-threaded, and doesn't use the LZO assembly decoder
-FILTER_OBJS += $(subst $(SRC)/,, \
-	$(patsubst %.S,%.o, $(sort $(wildcard $(SRC)/lzo/*.S))) \
-	$(patsubst %.c,%.o, $(sort $(wildcard $(SRC)/thread/*.c))) \
-	$(patsubst %.S,%.o, $(sort $(wildcard $(SRC)/thread/*.S)))) \
-	$(patsubst %.asm,%.o, $(sort $(wildcard $(SRC)/*.asm))) \
-	$(patsubst %.c,%.o, $(sort $(wildcard $(SRC)/bios*.c)))
+FILTER_DIRS += $(SRC)/bios
 endif
+FILTER_OBJS = $(patsubst $(SRC)/%,%/%,$(FILTER_DIRS))
 
 COBJS	 = $(filter-out $(FILTER_OBJS),$(COBJ))
 SOBJS	 = $(filter-out $(FILTER_OBJS),$(SOBJ))
 
-ifeq ($(FWCLASS),EFI)
-COBJS += $(subst $(SRC)/,,$(CORE_PXE_CSRC:%.c=%.o) fs/pxe/ftp.o fs/pxe/ftp_readdir.o \
-	fs/pxe/http.o fs/pxe/http_readdir.o)
-endif
-
-LIB	 = libcom32.a
+LIB	 = bios/libsyslinux.a
 LIBS	 = $(LIB) --whole-archive $(objdir)/com32/lib/libcom32core.a
 LIBDEP   = $(filter-out -% %start%,$(LIBS))
 LIBOBJS	 = $(COBJS) $(SOBJS)
@@ -145,79 +131,49 @@ ifeq ($(FWCLASS),BIOS)
 	$(NASM) -f $(NASM_ELF) $(NASMOPT) -DDATE_STR="'$(DATE)'" \
 		-DHEXDATE="$(HEXDATE)" \
 		-D$(ARCH) \
-		-I$(SRC)/ \
-		-l $(@:.o=.lsr) -o $@ -MP -MD $(dir $@).$(notdir $@).d $<
-
-AUXLIBS = libisolinux.a libisolinux-debug.a libldlinux.a \
-	libpxelinux.a liblpxelinux.a
+		-I$(SRC)/ -I$(SRC)/bios/ \
+		-l $(@:.o=.lsr) -o $@ -MP -MD $(@D)/.$(@F).d $<
 
-LDSCRIPT = $(SRC)/$(ARCH)/syslinux.ld
+AUXLIBS = bios/libpxelinux.a bios/liblpxelinux.a
+LDSCRIPT = $(SRC)/bios/syslinux.ld
 
 NASM_ELF = elf
 
-%.elf: %.o $(LIBDEP) $(LDSCRIPT) $(AUXLIBS)
+%.elf: %.o %-c.o lib%.a $(LIBDEP) $(LDSCRIPT)
 	$(LD) $(LDFLAGS) -pie -Bsymbolic \
 		-T $(LDSCRIPT) \
 		--unresolved-symbols=report-all \
-		-E --hash-style=gnu -M -o $@ $< \
-		--start-group $(LIBS) $(subst $(*F).elf,lib$(*F).a,$@) --end-group \
-		> $(@:.elf=.map)
+		-E --hash-style=gnu -M -o $@ $< $*-c.o \
+		--start-group $(*D)/lib$(*F).a $(LIBS) --end-group \
+		> $*.map
 	if [ `$(NM) -D -u $@ | wc -l` -ne 0 ]; then \
 		$(NM) -D -u $@ 1>&2; rm -f $@; false; fi
-	$(OBJDUMP) -h $@ > $(@:.elf=.sec)
-	$(PERL) $(SRC)/lstadjust.pl $(@:.elf=.lsr) $(@:.elf=.sec) $(@:.elf=.lst)
-
-libisolinux.a: rawcon.o localboot.o isolinux-c.o
-	rm -f $@
-	$(AR) cq $@ $^
-	$(RANLIB) $@
-
-libisolinux-debug.a: libisolinux.a
-	cp $^ $@
+	$(OBJDUMP) -h $@ > $*.sec
+	$(PERL) $(SRC)/lstadjust.pl $*.lsr $*.sec $*.lst
 
 # Legacy network stack
-libpxelinux.a: rawcon.o pxeboot.o pxelinux-c.o $(PXELINUX_OBJS)
-	rm -f $@
-	$(AR) cq $@ $^
-	$(RANLIB) $@
+bios/libpxelinux.a: $(CORE_PXE_OBJS) $(PXELINUX_OBJS)
 
 # LwIP network stack
-liblpxelinux.a: rawcon.o pxeboot.o pxelinux-c.o $(LPXELINUX_OBJS)
-	rm -f $@
-	$(AR) cq $@ $^
-	$(RANLIB) $@
+bios/liblpxelinux.a: $(CORE_PXE_OBJS) $(LPXELINUX_OBJS)
 
-libldlinux.a: plaincon.o localboot.o ldlinux-c.o
+# Otherwise, no special library needed, a null library will be created
+
+bios/lib%.a:
 	rm -f $@
 	$(AR) cq $@ $^
 	$(RANLIB) $@
 
-pxelinux.o: pxelinux.asm kwdhash.gen ../version.gen
-	$(NASM) -f $(NASM_ELF) $(NASMOPT) -DDATE_STR="'$(DATE)'" \
-		-DHEXDATE="$(HEXDATE)" \
-		-D$(ARCH) \
-		-I$(SRC)/ \
-		-DIS_LPXELINUX=0 \
-		-l $(@:.o=.lsr) -o $@ -MP -MD $(dir $@).$(notdir $@).d $<
-
-pxelinux.0: pxelinux.bin
+%.0: bios/%.bin
 	cp -f $< $@
 
-lpxelinux.o: pxelinux.asm kwdhash.gen ../version.gen
-	$(NASM) -f $(NASM_ELF) $(NASMOPT) -DDATE_STR="'$(DATE)'" \
-		-DHEXDATE="$(HEXDATE)" \
-		-D$(ARCH) \
-		-I$(SRC)/ \
-		-DIS_LPXELINUX=1 \
-		-l $(@:.o=.lsr) -o $@ -MP -MD $(dir $@).$(notdir $@).d $<
-
-lpxelinux.0: lpxelinux.bin
+%.bin: bios/%.bin
 	cp -f $< $@
 
-ldlinux.bss: ldlinux.bin
+ldlinux.bss: bios/ldlinux.bin
 	dd if=$< of=$@ bs=512 count=1
 
-ldlinux.sys: ldlinux.bin
+ldlinux.sys: bios/ldlinux.bin
 	dd if=$< of=$@ bs=512 skip=2
 
 endif # BIOS
@@ -241,11 +197,13 @@ install-all: install install-lib
 netinstall: installer
 
 tidy dist:
-	find . -type f \( -name '*.o' -o -name '*.a' -o -name '.*.d' \
-		-o -name '*.lst' \) -print | xargs -rt rm -f
-	rm -f codepage.cp *.elf stupid.* patch.offset .depend
-	rm -f *.elf.tmp *.sym
-	rm -f *.lsr *.map *.sec *.raw
+	for d in $(find . -type d -print) ; do \
+	( cd "$$d" ; \
+	  rm -f *.o *.a .*.d *.lst \
+	        codepage.cp *.elf stupid.* patch.offset .depend \
+	        *.elf.tmp *.sym \
+	        *.lsr *.map *.sec *.raw \
+	); done
 	rm -f $(OBSOLETE) $(LIB)
 
 clean: tidy
@@ -254,4 +212,4 @@ spotless: clean
 	rm -f $(BTARGET) *.bin *_bin.c
 
 # Include dependencies file
--include $(shell find . -name '.*.d' -print)
+-include $(shell find $(OBJ) -name '.*.d' -print)
diff --git a/core/adv.inc b/core/bios/adv.inc
similarity index 100%
rename from core/adv.inc
rename to core/bios/adv.inc
diff --git a/core/bcopy32.inc b/core/bios/bcopy32.inc
similarity index 100%
rename from core/bcopy32.inc
rename to core/bios/bcopy32.inc
diff --git a/core/bcopyxx.inc b/core/bios/bcopyxx.inc
similarity index 100%
rename from core/bcopyxx.inc
rename to core/bios/bcopyxx.inc
diff --git a/core/bios.c b/core/bios/bios.c
similarity index 100%
rename from core/bios.c
rename to core/bios/bios.c
diff --git a/core/bios.inc b/core/bios/bios.inc
similarity index 100%
rename from core/bios.inc
rename to core/bios/bios.inc
diff --git a/core/call16.c b/core/bios/call16.c
similarity index 100%
rename from core/call16.c
rename to core/bios/call16.c
diff --git a/core/callback.inc b/core/bios/callback.inc
similarity index 100%
rename from core/callback.inc
rename to core/bios/callback.inc
diff --git a/core/com32.inc b/core/bios/com32.inc
similarity index 100%
rename from core/com32.inc
rename to core/bios/com32.inc
diff --git a/core/common.inc b/core/bios/common.inc
similarity index 100%
rename from core/common.inc
rename to core/bios/common.inc
diff --git a/core/config.inc b/core/bios/config.inc
similarity index 100%
rename from core/config.inc
rename to core/bios/config.inc
diff --git a/core/conio.c b/core/bios/conio.c
similarity index 93%
copy from core/conio.c
copy to core/bios/conio.c
index e5e0ca76..ea7a3e5b 100644
--- a/core/conio.c
+++ b/core/bios/conio.c
@@ -188,11 +188,6 @@ int bios_pollchar(void)
 	return data;
 }
 
-__export int pollchar(void)
-{
-	return firmware->i_ops->pollchar();
-}
-
 void pm_pollchar(com32sys_t *regs)
 {
 	if (pollchar())
@@ -294,22 +289,6 @@ uint8_t bios_shiftflags(void)
 	return al;
 }
 
-__export uint8_t kbd_shiftflags(void)
-{
-	if (firmware->i_ops->shiftflags)
-		return firmware->i_ops->shiftflags();
-	else
-		return 0;	/* Unavailable on this firmware */
-}
-
-/*
- * getchar: Read a character from keyboard or serial port
- */
-__export char getchar(char *hi)
-{
-	return firmware->i_ops->getchar(hi);
-}
-
 void pm_getchar(com32sys_t *regs)
 {
 	regs->eax.b[0] = getchar((char *)&regs->eax.b[1]);
diff --git a/core/diskboot.inc b/core/bios/diskboot.inc
similarity index 100%
rename from core/diskboot.inc
rename to core/bios/diskboot.inc
diff --git a/core/diskfs.inc b/core/bios/diskfs.inc
similarity index 100%
rename from core/diskfs.inc
rename to core/bios/diskfs.inc
diff --git a/core/fs/diskio_bios.c b/core/bios/diskio_bios.c
similarity index 100%
rename from core/fs/diskio_bios.c
rename to core/bios/diskio_bios.c
diff --git a/core/diskstart.inc b/core/bios/diskstart.inc
similarity index 100%
rename from core/diskstart.inc
rename to core/bios/diskstart.inc
diff --git a/core/extern.inc b/core/bios/extern.inc
similarity index 93%
rename from core/extern.inc
rename to core/bios/extern.inc
index f5460232..e3539611 100644
--- a/core/extern.inc
+++ b/core/bios/extern.inc
@@ -9,16 +9,9 @@
 	; rllpack.c
 	extern rllpack, rllunpack
 
-	; hello.c
-	extern hello
-
 	; elflink/load_env32.c
 	extern load_env32, pm_env32_run
 
-	extern mp1, mp2, mp3, mp4, mp5
-
-	extern hexdump
-
 	extern mem_init
 
 	; fs.c
diff --git a/core/font.c b/core/bios/font.c
similarity index 100%
rename from core/font.c
rename to core/bios/font.c
diff --git a/core/graphics.c b/core/bios/graphics.c
similarity index 100%
rename from core/graphics.c
rename to core/bios/graphics.c
diff --git a/core/head.inc b/core/bios/head.inc
similarity index 100%
rename from core/head.inc
rename to core/bios/head.inc
diff --git a/core/init.inc b/core/bios/init.inc
similarity index 100%
rename from core/init.inc
rename to core/bios/init.inc
diff --git a/core/io.inc b/core/bios/io.inc
similarity index 100%
rename from core/io.inc
rename to core/bios/io.inc
diff --git a/core/isolinux-c.c b/core/bios/isolinux-c.c
similarity index 100%
rename from core/isolinux-c.c
rename to core/bios/isolinux-c.c
diff --git a/core/bios/isolinux-debug-c.c b/core/bios/isolinux-debug-c.c
new file mode 100644
index 00000000..14f05005
--- /dev/null
+++ b/core/bios/isolinux-debug-c.c
@@ -0,0 +1 @@
+#include "isolinux-c.c"
diff --git a/core/isolinux-debug.asm b/core/bios/isolinux-debug.asm
similarity index 100%
rename from core/isolinux-debug.asm
rename to core/bios/isolinux-debug.asm
diff --git a/core/isolinux.asm b/core/bios/isolinux.asm
similarity index 100%
rename from core/isolinux.asm
rename to core/bios/isolinux.asm
diff --git a/core/kaboom.c b/core/bios/kaboom.c
similarity index 100%
rename from core/kaboom.c
rename to core/bios/kaboom.c
diff --git a/core/kernel.inc b/core/bios/kernel.inc
similarity index 100%
rename from core/kernel.inc
rename to core/bios/kernel.inc
diff --git a/core/keywords.inc b/core/bios/keywords.inc
similarity index 100%
rename from core/keywords.inc
rename to core/bios/keywords.inc
diff --git a/core/layout.inc b/core/bios/layout.inc
similarity index 100%
rename from core/layout.inc
rename to core/bios/layout.inc
diff --git a/core/ldlinux-c.c b/core/bios/ldlinux-c.c
similarity index 100%
rename from core/ldlinux-c.c
rename to core/bios/ldlinux-c.c
diff --git a/core/ldlinux.asm b/core/bios/ldlinux.asm
similarity index 100%
rename from core/ldlinux.asm
rename to core/bios/ldlinux.asm
diff --git a/core/legacynet/core.c b/core/bios/legacynet/core.c
similarity index 99%
rename from core/legacynet/core.c
rename to core/bios/legacynet/core.c
index 24a670e0..13d47029 100644
--- a/core/legacynet/core.c
+++ b/core/bios/legacynet/core.c
@@ -2,7 +2,7 @@
 #include <com32.h>
 #include <core.h>
 #include <net.h>
-#include <pxe.h>
+#include "core_pxe.h"
 #include <minmax.h>
 
 /* Common receive buffer */
diff --git a/core/legacynet/dnsresolv.c b/core/bios/legacynet/dnsresolv.c
similarity index 99%
rename from core/legacynet/dnsresolv.c
rename to core/bios/legacynet/dnsresolv.c
index 9be0a436..809c7120 100644
--- a/core/legacynet/dnsresolv.c
+++ b/core/bios/legacynet/dnsresolv.c
@@ -1,7 +1,7 @@
 #include <stdio.h>
 #include <string.h>
 #include <core.h>
-#include "pxe.h"
+#include "core_pxe.h"
 
 /* DNS CLASS values we care about */
 #define CLASS_IN	1
diff --git a/core/legacynet/idle.c b/core/bios/legacynet/idle.c
similarity index 99%
rename from core/legacynet/idle.c
rename to core/bios/legacynet/idle.c
index 5a94166d..02efc85d 100644
--- a/core/legacynet/idle.c
+++ b/core/bios/legacynet/idle.c
@@ -17,7 +17,7 @@
 #include <fs.h>
 #include <minmax.h>
 #include <x86/cpu.h>
-#include "pxe.h"
+#include "core_pxe.h"
 
 static int pxe_idle_poll(void)
 {
diff --git a/core/legacynet/portnum.c b/core/bios/legacynet/portnum.c
similarity index 98%
rename from core/legacynet/portnum.c
rename to core/bios/legacynet/portnum.c
index e10af29e..5c066cc1 100644
--- a/core/legacynet/portnum.c
+++ b/core/bios/legacynet/portnum.c
@@ -13,7 +13,7 @@
 #include <stdint.h>
 #include <stdbool.h>
 #include <netinet/in.h>
-#include "pxe.h"
+#include "core_pxe.h"
 
 /* Port number bitmap - port numbers 49152 (0xc000) to 57343 (0xefff) */
 #define PORT_NUMBER_BASE	49152
diff --git a/core/localboot.c b/core/bios/localboot.c
similarity index 94%
rename from core/localboot.c
rename to core/bios/localboot.c
index c5fb9eca..d0c289d0 100644
--- a/core/localboot.c
+++ b/core/bios/localboot.c
@@ -22,6 +22,7 @@
  * localboot.c
  *
  * Boot from a local disk, or invoke INT 18h.
+ * This is default, but overridden for pxelinux, hence weak.
  */
 
 #define LOCALBOOT_MSG	"Booting from local disk..."
@@ -34,7 +35,7 @@ extern void local_boot16(void);
  * Boot a specified local disk.  AX specifies the BIOS disk number; or
  * -1 in case we should execute INT 18h ("next device.")
  */
-__export void local_boot(int16_t ax)
+__export void __attribute__((weak)) local_boot(int16_t ax)
 {
 	com32sys_t ireg, oreg;
 	int i;
diff --git a/core/localboot.inc b/core/bios/localboot.inc
similarity index 100%
rename from core/localboot.inc
rename to core/bios/localboot.inc
diff --git a/core/bios/lpxelinux-c.c b/core/bios/lpxelinux-c.c
new file mode 100644
index 00000000..93b4bc9e
--- /dev/null
+++ b/core/bios/lpxelinux-c.c
@@ -0,0 +1 @@
+#include "pxelinux-c.c"
diff --git a/core/bios/lpxelinux.asm b/core/bios/lpxelinux.asm
new file mode 100644
index 00000000..f41961d4
--- /dev/null
+++ b/core/bios/lpxelinux.asm
@@ -0,0 +1,2 @@
+%define IS_LPXELINUX 1
+%include "pxelinux.inc"
diff --git a/core/lwip/CHANGELOG b/core/bios/lwip/CHANGELOG
similarity index 100%
rename from core/lwip/CHANGELOG
rename to core/bios/lwip/CHANGELOG
diff --git a/core/lwip/COPYING b/core/bios/lwip/COPYING
similarity index 100%
rename from core/lwip/COPYING
rename to core/bios/lwip/COPYING
diff --git a/core/lwip/FILES b/core/bios/lwip/FILES
similarity index 100%
rename from core/lwip/FILES
rename to core/bios/lwip/FILES
diff --git a/core/lwip/README b/core/bios/lwip/README
similarity index 100%
rename from core/lwip/README
rename to core/bios/lwip/README
diff --git a/core/lwip/UPGRADING b/core/bios/lwip/UPGRADING
similarity index 100%
rename from core/lwip/UPGRADING
rename to core/bios/lwip/UPGRADING
diff --git a/core/fs/pxe/core.c b/core/bios/lwip/core.c
similarity index 99%
rename from core/fs/pxe/core.c
rename to core/bios/lwip/core.c
index a43ac465..b7a16825 100644
--- a/core/fs/pxe/core.c
+++ b/core/bios/lwip/core.c
@@ -4,7 +4,7 @@
 #include <lwip/dns.h>
 #include <core.h>
 #include <net.h>
-#include "pxe.h"
+#include "core_pxe.h"
 
 #include <dprintf.h>
 
diff --git a/core/fs/pxe/dnsresolv.c b/core/bios/lwip/dnsresolv.c
similarity index 99%
rename from core/fs/pxe/dnsresolv.c
rename to core/bios/lwip/dnsresolv.c
index 26c5b34b..0a61392e 100644
--- a/core/fs/pxe/dnsresolv.c
+++ b/core/bios/lwip/dnsresolv.c
@@ -1,7 +1,7 @@
 #include <stdio.h>
 #include <string.h>
 #include <core.h>
-#include "pxe.h"
+#include "core_pxe.h"
 #include "lwip/api.h"
 #include "lwip/dns.h"
 
diff --git a/core/lwip/doc/FILES b/core/bios/lwip/doc/FILES
similarity index 100%
rename from core/lwip/doc/FILES
rename to core/bios/lwip/doc/FILES
diff --git a/core/lwip/doc/contrib.txt b/core/bios/lwip/doc/contrib.txt
similarity index 100%
rename from core/lwip/doc/contrib.txt
rename to core/bios/lwip/doc/contrib.txt
diff --git a/core/lwip/doc/rawapi.txt b/core/bios/lwip/doc/rawapi.txt
similarity index 100%
rename from core/lwip/doc/rawapi.txt
rename to core/bios/lwip/doc/rawapi.txt
diff --git a/core/lwip/doc/savannah.txt b/core/bios/lwip/doc/savannah.txt
similarity index 100%
rename from core/lwip/doc/savannah.txt
rename to core/bios/lwip/doc/savannah.txt
diff --git a/core/lwip/doc/snmp_agent.txt b/core/bios/lwip/doc/snmp_agent.txt
similarity index 100%
rename from core/lwip/doc/snmp_agent.txt
rename to core/bios/lwip/doc/snmp_agent.txt
diff --git a/core/lwip/doc/sys_arch.txt b/core/bios/lwip/doc/sys_arch.txt
similarity index 100%
rename from core/lwip/doc/sys_arch.txt
rename to core/bios/lwip/doc/sys_arch.txt
diff --git a/core/fs/pxe/isr.c b/core/bios/lwip/isr.c
similarity index 96%
rename from core/fs/pxe/isr.c
rename to core/bios/lwip/isr.c
index 1fc9c3f2..ef7d95ec 100644
--- a/core/fs/pxe/isr.c
+++ b/core/bios/lwip/isr.c
@@ -7,7 +7,7 @@
 
 #include "core.h"
 #include "thread.h"
-#include "pxe.h"
+#include "core_pxe.h"
 #include <string.h>
 #include <x86/cpu.h>
 #include <sys/io.h>
@@ -266,11 +266,18 @@ void pxe_start_isr(void)
 	dprintf("pxe_start_isr: trying poll by model\n");
 	int hwad = ((int)MAC[0] << 16) + ((int)MAC[1] << 8) + MAC[2];
 	dprintf("pxe_start_isr: got %06x %04x\n", hwad, pxe_undi_iface.ServiceFlags);
-	if ((hwad == 0x000023ae) && (pxe_undi_iface.ServiceFlags == 0xdc1b) ||
-	    (hwad == 0x005c260a) && (pxe_undi_iface.ServiceFlags == 0xdc1b) ||
-	    (hwad == 0x00180373) && (pxe_undi_iface.ServiceFlags == 0xdc1b)) {
+	if (pxe_undi_iface.ServiceFlags == 0xdc1b) {
+	    switch (hwad) {
+	    case 0x000023ae:
+	    case 0x005c260a:
+	    case 0x00180373:
 		asm volatile("orb $1,%0" : "+m" (pxe_need_poll));
 		dprintf("pxe_start_isr: forcing pxe_need_poll by model\n");
+		break;
+	    default:
+		/* Assume we can (or maybe have to) actually use interrupts */
+		break;
+	    }
 	}
     }
 }
diff --git a/core/lwip/src/FILES b/core/bios/lwip/src/FILES
similarity index 100%
rename from core/lwip/src/FILES
rename to core/bios/lwip/src/FILES
diff --git a/core/lwip/src/api/api_lib.c b/core/bios/lwip/src/api/api_lib.c
similarity index 100%
rename from core/lwip/src/api/api_lib.c
rename to core/bios/lwip/src/api/api_lib.c
diff --git a/core/lwip/src/api/api_msg.c b/core/bios/lwip/src/api/api_msg.c
similarity index 100%
rename from core/lwip/src/api/api_msg.c
rename to core/bios/lwip/src/api/api_msg.c
diff --git a/core/lwip/src/api/err.c b/core/bios/lwip/src/api/err.c
similarity index 100%
rename from core/lwip/src/api/err.c
rename to core/bios/lwip/src/api/err.c
diff --git a/core/lwip/src/api/netbuf.c b/core/bios/lwip/src/api/netbuf.c
similarity index 100%
rename from core/lwip/src/api/netbuf.c
rename to core/bios/lwip/src/api/netbuf.c
diff --git a/core/lwip/src/api/netdb.c b/core/bios/lwip/src/api/netdb.c
similarity index 100%
rename from core/lwip/src/api/netdb.c
rename to core/bios/lwip/src/api/netdb.c
diff --git a/core/lwip/src/api/netifapi.c b/core/bios/lwip/src/api/netifapi.c
similarity index 100%
rename from core/lwip/src/api/netifapi.c
rename to core/bios/lwip/src/api/netifapi.c
diff --git a/core/lwip/src/api/sockets.c b/core/bios/lwip/src/api/sockets.c
similarity index 100%
rename from core/lwip/src/api/sockets.c
rename to core/bios/lwip/src/api/sockets.c
diff --git a/core/lwip/src/api/tcpip.c b/core/bios/lwip/src/api/tcpip.c
similarity index 100%
rename from core/lwip/src/api/tcpip.c
rename to core/bios/lwip/src/api/tcpip.c
diff --git a/core/lwip/src/arch/sys_arch.c b/core/bios/lwip/src/arch/sys_arch.c
similarity index 100%
rename from core/lwip/src/arch/sys_arch.c
rename to core/bios/lwip/src/arch/sys_arch.c
diff --git a/core/lwip/src/core/def.c b/core/bios/lwip/src/core/def.c
similarity index 100%
rename from core/lwip/src/core/def.c
rename to core/bios/lwip/src/core/def.c
diff --git a/core/lwip/src/core/dhcp.c b/core/bios/lwip/src/core/dhcp.c
similarity index 100%
rename from core/lwip/src/core/dhcp.c
rename to core/bios/lwip/src/core/dhcp.c
diff --git a/core/lwip/src/core/dns.c b/core/bios/lwip/src/core/dns.c
similarity index 100%
rename from core/lwip/src/core/dns.c
rename to core/bios/lwip/src/core/dns.c
diff --git a/core/lwip/src/core/init.c b/core/bios/lwip/src/core/init.c
similarity index 100%
rename from core/lwip/src/core/init.c
rename to core/bios/lwip/src/core/init.c
diff --git a/core/lwip/src/core/ipv4/autoip.c b/core/bios/lwip/src/core/ipv4/autoip.c
similarity index 100%
rename from core/lwip/src/core/ipv4/autoip.c
rename to core/bios/lwip/src/core/ipv4/autoip.c
diff --git a/core/lwip/src/core/ipv4/icmp.c b/core/bios/lwip/src/core/ipv4/icmp.c
similarity index 100%
rename from core/lwip/src/core/ipv4/icmp.c
rename to core/bios/lwip/src/core/ipv4/icmp.c
diff --git a/core/lwip/src/core/ipv4/igmp.c b/core/bios/lwip/src/core/ipv4/igmp.c
similarity index 100%
rename from core/lwip/src/core/ipv4/igmp.c
rename to core/bios/lwip/src/core/ipv4/igmp.c
diff --git a/core/lwip/src/core/ipv4/inet.c b/core/bios/lwip/src/core/ipv4/inet.c
similarity index 100%
rename from core/lwip/src/core/ipv4/inet.c
rename to core/bios/lwip/src/core/ipv4/inet.c
diff --git a/core/lwip/src/core/ipv4/inet_chksum.c b/core/bios/lwip/src/core/ipv4/inet_chksum.c
similarity index 100%
rename from core/lwip/src/core/ipv4/inet_chksum.c
rename to core/bios/lwip/src/core/ipv4/inet_chksum.c
diff --git a/core/lwip/src/core/ipv4/ip.c b/core/bios/lwip/src/core/ipv4/ip.c
similarity index 100%
rename from core/lwip/src/core/ipv4/ip.c
rename to core/bios/lwip/src/core/ipv4/ip.c
diff --git a/core/lwip/src/core/ipv4/ip_addr.c b/core/bios/lwip/src/core/ipv4/ip_addr.c
similarity index 100%
rename from core/lwip/src/core/ipv4/ip_addr.c
rename to core/bios/lwip/src/core/ipv4/ip_addr.c
diff --git a/core/lwip/src/core/ipv4/ip_frag.c b/core/bios/lwip/src/core/ipv4/ip_frag.c
similarity index 100%
rename from core/lwip/src/core/ipv4/ip_frag.c
rename to core/bios/lwip/src/core/ipv4/ip_frag.c
diff --git a/core/lwip/src/core/mem.c b/core/bios/lwip/src/core/mem.c
similarity index 100%
rename from core/lwip/src/core/mem.c
rename to core/bios/lwip/src/core/mem.c
diff --git a/core/lwip/src/core/memp.c b/core/bios/lwip/src/core/memp.c
similarity index 100%
rename from core/lwip/src/core/memp.c
rename to core/bios/lwip/src/core/memp.c
diff --git a/core/lwip/src/core/netif.c b/core/bios/lwip/src/core/netif.c
similarity index 100%
rename from core/lwip/src/core/netif.c
rename to core/bios/lwip/src/core/netif.c
diff --git a/core/lwip/src/core/pbuf.c b/core/bios/lwip/src/core/pbuf.c
similarity index 100%
rename from core/lwip/src/core/pbuf.c
rename to core/bios/lwip/src/core/pbuf.c
diff --git a/core/lwip/src/core/raw.c b/core/bios/lwip/src/core/raw.c
similarity index 100%
rename from core/lwip/src/core/raw.c
rename to core/bios/lwip/src/core/raw.c
diff --git a/core/lwip/src/core/snmp/asn1_dec.c b/core/bios/lwip/src/core/snmp/asn1_dec.c
similarity index 100%
rename from core/lwip/src/core/snmp/asn1_dec.c
rename to core/bios/lwip/src/core/snmp/asn1_dec.c
diff --git a/core/lwip/src/core/snmp/asn1_enc.c b/core/bios/lwip/src/core/snmp/asn1_enc.c
similarity index 100%
rename from core/lwip/src/core/snmp/asn1_enc.c
rename to core/bios/lwip/src/core/snmp/asn1_enc.c
diff --git a/core/lwip/src/core/snmp/mib2.c b/core/bios/lwip/src/core/snmp/mib2.c
similarity index 100%
rename from core/lwip/src/core/snmp/mib2.c
rename to core/bios/lwip/src/core/snmp/mib2.c
diff --git a/core/lwip/src/core/snmp/mib_structs.c b/core/bios/lwip/src/core/snmp/mib_structs.c
similarity index 100%
rename from core/lwip/src/core/snmp/mib_structs.c
rename to core/bios/lwip/src/core/snmp/mib_structs.c
diff --git a/core/lwip/src/core/snmp/msg_in.c b/core/bios/lwip/src/core/snmp/msg_in.c
similarity index 100%
rename from core/lwip/src/core/snmp/msg_in.c
rename to core/bios/lwip/src/core/snmp/msg_in.c
diff --git a/core/lwip/src/core/snmp/msg_out.c b/core/bios/lwip/src/core/snmp/msg_out.c
similarity index 100%
rename from core/lwip/src/core/snmp/msg_out.c
rename to core/bios/lwip/src/core/snmp/msg_out.c
diff --git a/core/lwip/src/core/stats.c b/core/bios/lwip/src/core/stats.c
similarity index 100%
rename from core/lwip/src/core/stats.c
rename to core/bios/lwip/src/core/stats.c
diff --git a/core/lwip/src/core/sys.c b/core/bios/lwip/src/core/sys.c
similarity index 100%
rename from core/lwip/src/core/sys.c
rename to core/bios/lwip/src/core/sys.c
diff --git a/core/lwip/src/core/tcp.c b/core/bios/lwip/src/core/tcp.c
similarity index 100%
rename from core/lwip/src/core/tcp.c
rename to core/bios/lwip/src/core/tcp.c
diff --git a/core/lwip/src/core/tcp_in.c b/core/bios/lwip/src/core/tcp_in.c
similarity index 100%
rename from core/lwip/src/core/tcp_in.c
rename to core/bios/lwip/src/core/tcp_in.c
diff --git a/core/lwip/src/core/tcp_out.c b/core/bios/lwip/src/core/tcp_out.c
similarity index 100%
rename from core/lwip/src/core/tcp_out.c
rename to core/bios/lwip/src/core/tcp_out.c
diff --git a/core/lwip/src/core/timers.c b/core/bios/lwip/src/core/timers.c
similarity index 100%
rename from core/lwip/src/core/timers.c
rename to core/bios/lwip/src/core/timers.c
diff --git a/core/lwip/src/core/udp.c b/core/bios/lwip/src/core/udp.c
similarity index 100%
rename from core/lwip/src/core/udp.c
rename to core/bios/lwip/src/core/udp.c
diff --git a/core/lwip/src/include/arch/cc.h b/core/bios/lwip/src/include/arch/cc.h
similarity index 100%
rename from core/lwip/src/include/arch/cc.h
rename to core/bios/lwip/src/include/arch/cc.h
diff --git a/core/lwip/src/include/arch/perf.h b/core/bios/lwip/src/include/arch/perf.h
similarity index 100%
rename from core/lwip/src/include/arch/perf.h
rename to core/bios/lwip/src/include/arch/perf.h
diff --git a/core/lwip/src/include/arch/sys_arch.h b/core/bios/lwip/src/include/arch/sys_arch.h
similarity index 100%
rename from core/lwip/src/include/arch/sys_arch.h
rename to core/bios/lwip/src/include/arch/sys_arch.h
diff --git a/core/lwip/src/include/ipv4/lwip/autoip.h b/core/bios/lwip/src/include/ipv4/lwip/autoip.h
similarity index 100%
rename from core/lwip/src/include/ipv4/lwip/autoip.h
rename to core/bios/lwip/src/include/ipv4/lwip/autoip.h
diff --git a/core/lwip/src/include/ipv4/lwip/icmp.h b/core/bios/lwip/src/include/ipv4/lwip/icmp.h
similarity index 100%
rename from core/lwip/src/include/ipv4/lwip/icmp.h
rename to core/bios/lwip/src/include/ipv4/lwip/icmp.h
diff --git a/core/lwip/src/include/ipv4/lwip/igmp.h b/core/bios/lwip/src/include/ipv4/lwip/igmp.h
similarity index 100%
rename from core/lwip/src/include/ipv4/lwip/igmp.h
rename to core/bios/lwip/src/include/ipv4/lwip/igmp.h
diff --git a/core/lwip/src/include/ipv4/lwip/inet.h b/core/bios/lwip/src/include/ipv4/lwip/inet.h
similarity index 100%
rename from core/lwip/src/include/ipv4/lwip/inet.h
rename to core/bios/lwip/src/include/ipv4/lwip/inet.h
diff --git a/core/lwip/src/include/ipv4/lwip/inet_chksum.h b/core/bios/lwip/src/include/ipv4/lwip/inet_chksum.h
similarity index 100%
rename from core/lwip/src/include/ipv4/lwip/inet_chksum.h
rename to core/bios/lwip/src/include/ipv4/lwip/inet_chksum.h
diff --git a/core/lwip/src/include/ipv4/lwip/ip.h b/core/bios/lwip/src/include/ipv4/lwip/ip.h
similarity index 100%
rename from core/lwip/src/include/ipv4/lwip/ip.h
rename to core/bios/lwip/src/include/ipv4/lwip/ip.h
diff --git a/core/lwip/src/include/ipv4/lwip/ip_addr.h b/core/bios/lwip/src/include/ipv4/lwip/ip_addr.h
similarity index 100%
rename from core/lwip/src/include/ipv4/lwip/ip_addr.h
rename to core/bios/lwip/src/include/ipv4/lwip/ip_addr.h
diff --git a/core/lwip/src/include/ipv4/lwip/ip_frag.h b/core/bios/lwip/src/include/ipv4/lwip/ip_frag.h
similarity index 100%
rename from core/lwip/src/include/ipv4/lwip/ip_frag.h
rename to core/bios/lwip/src/include/ipv4/lwip/ip_frag.h
diff --git a/core/lwip/src/include/lwip/api.h b/core/bios/lwip/src/include/lwip/api.h
similarity index 100%
rename from core/lwip/src/include/lwip/api.h
rename to core/bios/lwip/src/include/lwip/api.h
diff --git a/core/lwip/src/include/lwip/api_msg.h b/core/bios/lwip/src/include/lwip/api_msg.h
similarity index 100%
rename from core/lwip/src/include/lwip/api_msg.h
rename to core/bios/lwip/src/include/lwip/api_msg.h
diff --git a/core/lwip/src/include/lwip/arch.h b/core/bios/lwip/src/include/lwip/arch.h
similarity index 100%
rename from core/lwip/src/include/lwip/arch.h
rename to core/bios/lwip/src/include/lwip/arch.h
diff --git a/core/lwip/src/include/lwip/debug.h b/core/bios/lwip/src/include/lwip/debug.h
similarity index 100%
rename from core/lwip/src/include/lwip/debug.h
rename to core/bios/lwip/src/include/lwip/debug.h
diff --git a/core/lwip/src/include/lwip/def.h b/core/bios/lwip/src/include/lwip/def.h
similarity index 100%
rename from core/lwip/src/include/lwip/def.h
rename to core/bios/lwip/src/include/lwip/def.h
diff --git a/core/lwip/src/include/lwip/dhcp.h b/core/bios/lwip/src/include/lwip/dhcp.h
similarity index 100%
rename from core/lwip/src/include/lwip/dhcp.h
rename to core/bios/lwip/src/include/lwip/dhcp.h
diff --git a/core/lwip/src/include/lwip/dns.h b/core/bios/lwip/src/include/lwip/dns.h
similarity index 100%
rename from core/lwip/src/include/lwip/dns.h
rename to core/bios/lwip/src/include/lwip/dns.h
diff --git a/core/lwip/src/include/lwip/err.h b/core/bios/lwip/src/include/lwip/err.h
similarity index 100%
rename from core/lwip/src/include/lwip/err.h
rename to core/bios/lwip/src/include/lwip/err.h
diff --git a/core/lwip/src/include/lwip/init.h b/core/bios/lwip/src/include/lwip/init.h
similarity index 100%
rename from core/lwip/src/include/lwip/init.h
rename to core/bios/lwip/src/include/lwip/init.h
diff --git a/core/lwip/src/include/lwip/mem.h b/core/bios/lwip/src/include/lwip/mem.h
similarity index 100%
rename from core/lwip/src/include/lwip/mem.h
rename to core/bios/lwip/src/include/lwip/mem.h
diff --git a/core/lwip/src/include/lwip/memp.h b/core/bios/lwip/src/include/lwip/memp.h
similarity index 100%
rename from core/lwip/src/include/lwip/memp.h
rename to core/bios/lwip/src/include/lwip/memp.h
diff --git a/core/lwip/src/include/lwip/memp_std.h b/core/bios/lwip/src/include/lwip/memp_std.h
similarity index 100%
rename from core/lwip/src/include/lwip/memp_std.h
rename to core/bios/lwip/src/include/lwip/memp_std.h
diff --git a/core/lwip/src/include/lwip/netbuf.h b/core/bios/lwip/src/include/lwip/netbuf.h
similarity index 100%
rename from core/lwip/src/include/lwip/netbuf.h
rename to core/bios/lwip/src/include/lwip/netbuf.h
diff --git a/core/lwip/src/include/lwip/netdb.h b/core/bios/lwip/src/include/lwip/netdb.h
similarity index 100%
rename from core/lwip/src/include/lwip/netdb.h
rename to core/bios/lwip/src/include/lwip/netdb.h
diff --git a/core/lwip/src/include/lwip/netif.h b/core/bios/lwip/src/include/lwip/netif.h
similarity index 100%
rename from core/lwip/src/include/lwip/netif.h
rename to core/bios/lwip/src/include/lwip/netif.h
diff --git a/core/lwip/src/include/lwip/netifapi.h b/core/bios/lwip/src/include/lwip/netifapi.h
similarity index 100%
rename from core/lwip/src/include/lwip/netifapi.h
rename to core/bios/lwip/src/include/lwip/netifapi.h
diff --git a/core/lwip/src/include/lwip/opt.h b/core/bios/lwip/src/include/lwip/opt.h
similarity index 100%
rename from core/lwip/src/include/lwip/opt.h
rename to core/bios/lwip/src/include/lwip/opt.h
diff --git a/core/lwip/src/include/lwip/pbuf.h b/core/bios/lwip/src/include/lwip/pbuf.h
similarity index 100%
rename from core/lwip/src/include/lwip/pbuf.h
rename to core/bios/lwip/src/include/lwip/pbuf.h
diff --git a/core/lwip/src/include/lwip/raw.h b/core/bios/lwip/src/include/lwip/raw.h
similarity index 100%
rename from core/lwip/src/include/lwip/raw.h
rename to core/bios/lwip/src/include/lwip/raw.h
diff --git a/core/lwip/src/include/lwip/sio.h b/core/bios/lwip/src/include/lwip/sio.h
similarity index 100%
rename from core/lwip/src/include/lwip/sio.h
rename to core/bios/lwip/src/include/lwip/sio.h
diff --git a/core/lwip/src/include/lwip/snmp.h b/core/bios/lwip/src/include/lwip/snmp.h
similarity index 100%
rename from core/lwip/src/include/lwip/snmp.h
rename to core/bios/lwip/src/include/lwip/snmp.h
diff --git a/core/lwip/src/include/lwip/snmp_asn1.h b/core/bios/lwip/src/include/lwip/snmp_asn1.h
similarity index 100%
rename from core/lwip/src/include/lwip/snmp_asn1.h
rename to core/bios/lwip/src/include/lwip/snmp_asn1.h
diff --git a/core/lwip/src/include/lwip/snmp_msg.h b/core/bios/lwip/src/include/lwip/snmp_msg.h
similarity index 100%
rename from core/lwip/src/include/lwip/snmp_msg.h
rename to core/bios/lwip/src/include/lwip/snmp_msg.h
diff --git a/core/lwip/src/include/lwip/snmp_structs.h b/core/bios/lwip/src/include/lwip/snmp_structs.h
similarity index 100%
rename from core/lwip/src/include/lwip/snmp_structs.h
rename to core/bios/lwip/src/include/lwip/snmp_structs.h
diff --git a/core/lwip/src/include/lwip/sockets.h b/core/bios/lwip/src/include/lwip/sockets.h
similarity index 100%
rename from core/lwip/src/include/lwip/sockets.h
rename to core/bios/lwip/src/include/lwip/sockets.h
diff --git a/core/lwip/src/include/lwip/stats.h b/core/bios/lwip/src/include/lwip/stats.h
similarity index 100%
rename from core/lwip/src/include/lwip/stats.h
rename to core/bios/lwip/src/include/lwip/stats.h
diff --git a/core/lwip/src/include/lwip/sys.h b/core/bios/lwip/src/include/lwip/sys.h
similarity index 100%
rename from core/lwip/src/include/lwip/sys.h
rename to core/bios/lwip/src/include/lwip/sys.h
diff --git a/core/lwip/src/include/lwip/tcp.h b/core/bios/lwip/src/include/lwip/tcp.h
similarity index 100%
rename from core/lwip/src/include/lwip/tcp.h
rename to core/bios/lwip/src/include/lwip/tcp.h
diff --git a/core/lwip/src/include/lwip/tcp_impl.h b/core/bios/lwip/src/include/lwip/tcp_impl.h
similarity index 100%
rename from core/lwip/src/include/lwip/tcp_impl.h
rename to core/bios/lwip/src/include/lwip/tcp_impl.h
diff --git a/core/lwip/src/include/lwip/tcpip.h b/core/bios/lwip/src/include/lwip/tcpip.h
similarity index 100%
rename from core/lwip/src/include/lwip/tcpip.h
rename to core/bios/lwip/src/include/lwip/tcpip.h
diff --git a/core/lwip/src/include/lwip/timers.h b/core/bios/lwip/src/include/lwip/timers.h
similarity index 100%
rename from core/lwip/src/include/lwip/timers.h
rename to core/bios/lwip/src/include/lwip/timers.h
diff --git a/core/lwip/src/include/lwip/udp.h b/core/bios/lwip/src/include/lwip/udp.h
similarity index 100%
rename from core/lwip/src/include/lwip/udp.h
rename to core/bios/lwip/src/include/lwip/udp.h
diff --git a/core/lwip/src/include/lwipopts.h b/core/bios/lwip/src/include/lwipopts.h
similarity index 100%
rename from core/lwip/src/include/lwipopts.h
rename to core/bios/lwip/src/include/lwipopts.h
diff --git a/core/lwip/src/include/netif/etharp.h b/core/bios/lwip/src/include/netif/etharp.h
similarity index 100%
rename from core/lwip/src/include/netif/etharp.h
rename to core/bios/lwip/src/include/netif/etharp.h
diff --git a/core/lwip/src/include/netif/ppp_oe.h b/core/bios/lwip/src/include/netif/ppp_oe.h
similarity index 100%
rename from core/lwip/src/include/netif/ppp_oe.h
rename to core/bios/lwip/src/include/netif/ppp_oe.h
diff --git a/core/lwip/src/include/netif/slipif.h b/core/bios/lwip/src/include/netif/slipif.h
similarity index 100%
rename from core/lwip/src/include/netif/slipif.h
rename to core/bios/lwip/src/include/netif/slipif.h
diff --git a/core/lwip/src/netif/FILES b/core/bios/lwip/src/netif/FILES
similarity index 100%
rename from core/lwip/src/netif/FILES
rename to core/bios/lwip/src/netif/FILES
diff --git a/core/lwip/src/netif/etharp.c b/core/bios/lwip/src/netif/etharp.c
similarity index 100%
rename from core/lwip/src/netif/etharp.c
rename to core/bios/lwip/src/netif/etharp.c
diff --git a/core/lwip/src/netif/ethernetif.c b/core/bios/lwip/src/netif/ethernetif.c
similarity index 100%
rename from core/lwip/src/netif/ethernetif.c
rename to core/bios/lwip/src/netif/ethernetif.c
diff --git a/core/lwip/src/netif/ppp/auth.c b/core/bios/lwip/src/netif/ppp/auth.c
similarity index 100%
rename from core/lwip/src/netif/ppp/auth.c
rename to core/bios/lwip/src/netif/ppp/auth.c
diff --git a/core/lwip/src/netif/ppp/auth.h b/core/bios/lwip/src/netif/ppp/auth.h
similarity index 100%
rename from core/lwip/src/netif/ppp/auth.h
rename to core/bios/lwip/src/netif/ppp/auth.h
diff --git a/core/lwip/src/netif/ppp/chap.c b/core/bios/lwip/src/netif/ppp/chap.c
similarity index 100%
rename from core/lwip/src/netif/ppp/chap.c
rename to core/bios/lwip/src/netif/ppp/chap.c
diff --git a/core/lwip/src/netif/ppp/chap.h b/core/bios/lwip/src/netif/ppp/chap.h
similarity index 100%
rename from core/lwip/src/netif/ppp/chap.h
rename to core/bios/lwip/src/netif/ppp/chap.h
diff --git a/core/lwip/src/netif/ppp/chpms.c b/core/bios/lwip/src/netif/ppp/chpms.c
similarity index 100%
rename from core/lwip/src/netif/ppp/chpms.c
rename to core/bios/lwip/src/netif/ppp/chpms.c
diff --git a/core/lwip/src/netif/ppp/chpms.h b/core/bios/lwip/src/netif/ppp/chpms.h
similarity index 100%
rename from core/lwip/src/netif/ppp/chpms.h
rename to core/bios/lwip/src/netif/ppp/chpms.h
diff --git a/core/lwip/src/netif/ppp/fsm.c b/core/bios/lwip/src/netif/ppp/fsm.c
similarity index 100%
rename from core/lwip/src/netif/ppp/fsm.c
rename to core/bios/lwip/src/netif/ppp/fsm.c
diff --git a/core/lwip/src/netif/ppp/fsm.h b/core/bios/lwip/src/netif/ppp/fsm.h
similarity index 100%
rename from core/lwip/src/netif/ppp/fsm.h
rename to core/bios/lwip/src/netif/ppp/fsm.h
diff --git a/core/lwip/src/netif/ppp/ipcp.c b/core/bios/lwip/src/netif/ppp/ipcp.c
similarity index 100%
rename from core/lwip/src/netif/ppp/ipcp.c
rename to core/bios/lwip/src/netif/ppp/ipcp.c
diff --git a/core/lwip/src/netif/ppp/ipcp.h b/core/bios/lwip/src/netif/ppp/ipcp.h
similarity index 100%
rename from core/lwip/src/netif/ppp/ipcp.h
rename to core/bios/lwip/src/netif/ppp/ipcp.h
diff --git a/core/lwip/src/netif/ppp/lcp.c b/core/bios/lwip/src/netif/ppp/lcp.c
similarity index 100%
rename from core/lwip/src/netif/ppp/lcp.c
rename to core/bios/lwip/src/netif/ppp/lcp.c
diff --git a/core/lwip/src/netif/ppp/lcp.h b/core/bios/lwip/src/netif/ppp/lcp.h
similarity index 100%
rename from core/lwip/src/netif/ppp/lcp.h
rename to core/bios/lwip/src/netif/ppp/lcp.h
diff --git a/core/lwip/src/netif/ppp/magic.c b/core/bios/lwip/src/netif/ppp/magic.c
similarity index 100%
rename from core/lwip/src/netif/ppp/magic.c
rename to core/bios/lwip/src/netif/ppp/magic.c
diff --git a/core/lwip/src/netif/ppp/magic.h b/core/bios/lwip/src/netif/ppp/magic.h
similarity index 100%
rename from core/lwip/src/netif/ppp/magic.h
rename to core/bios/lwip/src/netif/ppp/magic.h
diff --git a/core/lwip/src/netif/ppp/md5.c b/core/bios/lwip/src/netif/ppp/md5.c
similarity index 100%
rename from core/lwip/src/netif/ppp/md5.c
rename to core/bios/lwip/src/netif/ppp/md5.c
diff --git a/core/lwip/src/netif/ppp/md5.h b/core/bios/lwip/src/netif/ppp/md5.h
similarity index 100%
rename from core/lwip/src/netif/ppp/md5.h
rename to core/bios/lwip/src/netif/ppp/md5.h
diff --git a/core/lwip/src/netif/ppp/pap.c b/core/bios/lwip/src/netif/ppp/pap.c
similarity index 100%
rename from core/lwip/src/netif/ppp/pap.c
rename to core/bios/lwip/src/netif/ppp/pap.c
diff --git a/core/lwip/src/netif/ppp/pap.h b/core/bios/lwip/src/netif/ppp/pap.h
similarity index 100%
rename from core/lwip/src/netif/ppp/pap.h
rename to core/bios/lwip/src/netif/ppp/pap.h
diff --git a/core/lwip/src/netif/ppp/ppp.c b/core/bios/lwip/src/netif/ppp/ppp.c
similarity index 100%
rename from core/lwip/src/netif/ppp/ppp.c
rename to core/bios/lwip/src/netif/ppp/ppp.c
diff --git a/core/lwip/src/netif/ppp/ppp.h b/core/bios/lwip/src/netif/ppp/ppp.h
similarity index 100%
rename from core/lwip/src/netif/ppp/ppp.h
rename to core/bios/lwip/src/netif/ppp/ppp.h
diff --git a/core/lwip/src/netif/ppp/ppp_oe.c b/core/bios/lwip/src/netif/ppp/ppp_oe.c
similarity index 100%
rename from core/lwip/src/netif/ppp/ppp_oe.c
rename to core/bios/lwip/src/netif/ppp/ppp_oe.c
diff --git a/core/lwip/src/netif/ppp/pppdebug.h b/core/bios/lwip/src/netif/ppp/pppdebug.h
similarity index 100%
rename from core/lwip/src/netif/ppp/pppdebug.h
rename to core/bios/lwip/src/netif/ppp/pppdebug.h
diff --git a/core/lwip/src/netif/ppp/randm.c b/core/bios/lwip/src/netif/ppp/randm.c
similarity index 100%
rename from core/lwip/src/netif/ppp/randm.c
rename to core/bios/lwip/src/netif/ppp/randm.c
diff --git a/core/lwip/src/netif/ppp/randm.h b/core/bios/lwip/src/netif/ppp/randm.h
similarity index 100%
rename from core/lwip/src/netif/ppp/randm.h
rename to core/bios/lwip/src/netif/ppp/randm.h
diff --git a/core/lwip/src/netif/ppp/vj.c b/core/bios/lwip/src/netif/ppp/vj.c
similarity index 100%
rename from core/lwip/src/netif/ppp/vj.c
rename to core/bios/lwip/src/netif/ppp/vj.c
diff --git a/core/lwip/src/netif/ppp/vj.h b/core/bios/lwip/src/netif/ppp/vj.h
similarity index 100%
rename from core/lwip/src/netif/ppp/vj.h
rename to core/bios/lwip/src/netif/ppp/vj.h
diff --git a/core/lwip/src/netif/slipif.c b/core/bios/lwip/src/netif/slipif.c
similarity index 100%
rename from core/lwip/src/netif/slipif.c
rename to core/bios/lwip/src/netif/slipif.c
diff --git a/core/lwip/src/netif/undiif.c b/core/bios/lwip/src/netif/undiif.c
similarity index 99%
rename from core/lwip/src/netif/undiif.c
rename to core/bios/lwip/src/netif/undiif.c
index d68edef1..42706658 100644
--- a/core/lwip/src/netif/undiif.c
+++ b/core/bios/lwip/src/netif/undiif.c
@@ -76,7 +76,7 @@
 #include "netif/ppp_oe.h"
 #include "lwip/netifapi.h"
 #include "lwip/tcpip.h"
-#include "../../../fs/pxe/pxe.h"
+#include "core_pxe.h"
 
 #include <inttypes.h>
 #include <string.h>
diff --git a/core/fs/pxe/tcp.c b/core/bios/lwip/tcp.c
similarity index 97%
rename from core/fs/pxe/tcp.c
rename to core/bios/lwip/tcp.c
index 0fb6efd0..d32b5207 100644
--- a/core/fs/pxe/tcp.c
+++ b/core/bios/lwip/tcp.c
@@ -16,7 +16,7 @@
  * Common operations for TCP-based network protocols
  */
 
-#include "pxe.h"
+#include "core_pxe.h"
 #include "net.h"
 
 const struct pxe_conn_ops tcp_conn_ops = {
diff --git a/core/thread/exit_thread.c b/core/bios/lwip/thread/exit_thread.c
similarity index 100%
rename from core/thread/exit_thread.c
rename to core/bios/lwip/thread/exit_thread.c
diff --git a/core/thread/idle_thread.c b/core/bios/lwip/thread/idle_thread.c
similarity index 100%
rename from core/thread/idle_thread.c
rename to core/bios/lwip/thread/idle_thread.c
diff --git a/core/thread/kill_thread.c b/core/bios/lwip/thread/kill_thread.c
similarity index 100%
rename from core/thread/kill_thread.c
rename to core/bios/lwip/thread/kill_thread.c
diff --git a/core/thread/mbox.c b/core/bios/lwip/thread/mbox.c
similarity index 100%
rename from core/thread/mbox.c
rename to core/bios/lwip/thread/mbox.c
diff --git a/core/thread/root_thread.c b/core/bios/lwip/thread/root_thread.c
similarity index 100%
rename from core/thread/root_thread.c
rename to core/bios/lwip/thread/root_thread.c
diff --git a/core/thread/schedule.c b/core/bios/lwip/thread/schedule.c
similarity index 96%
rename from core/thread/schedule.c
rename to core/bios/lwip/thread/schedule.c
index 4f0dfe37..9dbc5843 100644
--- a/core/thread/schedule.c
+++ b/core/bios/lwip/thread/schedule.c
@@ -2,11 +2,11 @@
 #include <x86/cpu.h>
 #include "thread.h"
 #include "core.h"
-#include <dprintf.h>
 
-#ifndef DEBUG_THREAD
-#define dprintf
+#ifndef DEBUG_THREAD		/* Thread debugging is extra tricky */
+# undef DEBUG_CORE
 #endif
+#include <dprintf.h>
 
 void (*sched_hook_func)(void);
 
diff --git a/core/thread/sem_asm.S b/core/bios/lwip/thread/sem_asm.S
similarity index 100%
rename from core/thread/sem_asm.S
rename to core/bios/lwip/thread/sem_asm.S
diff --git a/core/thread/semaphore.c b/core/bios/lwip/thread/semaphore.c
similarity index 100%
rename from core/thread/semaphore.c
rename to core/bios/lwip/thread/semaphore.c
diff --git a/core/thread/start_thread.c b/core/bios/lwip/thread/start_thread.c
similarity index 100%
rename from core/thread/start_thread.c
rename to core/bios/lwip/thread/start_thread.c
diff --git a/core/thread/thread_asm.S b/core/bios/lwip/thread/thread_asm.S
similarity index 100%
rename from core/thread/thread_asm.S
rename to core/bios/lwip/thread/thread_asm.S
diff --git a/core/thread/timeout.c b/core/bios/lwip/thread/timeout.c
similarity index 100%
rename from core/thread/timeout.c
rename to core/bios/lwip/thread/timeout.c
diff --git a/core/lzo/enter.ash b/core/bios/lzo/enter.ash
similarity index 100%
rename from core/lzo/enter.ash
rename to core/bios/lzo/enter.ash
diff --git a/core/lzo/leave.ash b/core/bios/lzo/leave.ash
similarity index 100%
rename from core/lzo/leave.ash
rename to core/bios/lzo/leave.ash
diff --git a/core/lzo/lzo1c_d.ash b/core/bios/lzo/lzo1c_d.ash
similarity index 100%
rename from core/lzo/lzo1c_d.ash
rename to core/bios/lzo/lzo1c_d.ash
diff --git a/core/lzo/lzo1f_d.ash b/core/bios/lzo/lzo1f_d.ash
similarity index 100%
rename from core/lzo/lzo1f_d.ash
rename to core/bios/lzo/lzo1f_d.ash
diff --git a/core/lzo/lzo1x_d.ash b/core/bios/lzo/lzo1x_d.ash
similarity index 100%
rename from core/lzo/lzo1x_d.ash
rename to core/bios/lzo/lzo1x_d.ash
diff --git a/core/lzo/lzo1x_f2.S b/core/bios/lzo/lzo1x_f2.S
similarity index 100%
rename from core/lzo/lzo1x_f2.S
rename to core/bios/lzo/lzo1x_f2.S
diff --git a/core/lzo/lzo_asm.h b/core/bios/lzo/lzo_asm.h
similarity index 100%
rename from core/lzo/lzo_asm.h
rename to core/bios/lzo/lzo_asm.h
diff --git a/core/macros.inc b/core/bios/macros.inc
similarity index 100%
rename from core/macros.inc
rename to core/bios/macros.inc
diff --git a/core/bios/null_thread.c b/core/bios/null_thread.c
new file mode 100644
index 00000000..51e0441c
--- /dev/null
+++ b/core/bios/null_thread.c
@@ -0,0 +1,18 @@
+/*
+ * Null implementation of threading
+ */
+
+#include "thread.h"
+
+mstime_t __attribute__((weak)) sem_down(struct semaphore *sem, mstime_t ms)
+{
+    (void)sem;
+    (void)ms;
+    return 0;
+}
+
+void __attribute__((weak)) sem_up(struct semaphore *sem)
+{
+    (void)sem;
+}
+
diff --git a/core/plaincon.c b/core/bios/plaincon.c
similarity index 100%
rename from core/plaincon.c
rename to core/bios/plaincon.c
diff --git a/core/pm.inc b/core/bios/pm.inc
similarity index 100%
rename from core/pm.inc
rename to core/bios/pm.inc
diff --git a/core/pmcall.inc b/core/bios/pmcall.inc
similarity index 100%
rename from core/pmcall.inc
rename to core/bios/pmcall.inc
diff --git a/core/prefix.inc b/core/bios/prefix.inc
similarity index 100%
rename from core/prefix.inc
rename to core/bios/prefix.inc
diff --git a/core/pxe.inc b/core/bios/pxe.inc
similarity index 100%
rename from core/pxe.inc
rename to core/bios/pxe.inc
diff --git a/core/fs/pxe/bios.c b/core/bios/pxe/bios.c
similarity index 95%
rename from core/fs/pxe/bios.c
rename to core/bios/pxe/bios.c
index ddf9982b..2db7a544 100644
--- a/core/fs/pxe/bios.c
+++ b/core/bios/pxe/bios.c
@@ -1,11 +1,12 @@
 #include <syslinux/firmware.h>
 #include <syslinux/memscan.h>
 #include <core.h>
-#include "pxe.h"
+#include "core_pxe.h"
 #include <net.h>
 #include <minmax.h>
 #include <bios.h>
 #include <dprintf.h>
+#include "thread.h"
 
 static uint16_t real_base_mem;	   /* Amount of DOS memory after freeing */
 
@@ -458,3 +459,30 @@ void net_parse_dhcp(void)
 
     lfree(bp);
 }
+
+/*
+ * the ASM pxenv function wrapper, return 1 if error, or 0
+ *
+ */
+__export int pxe_call(int opcode, void *data)
+{
+    static DECLARE_INIT_SEMAPHORE(pxe_sem, 1);
+    extern void pxenv(void);
+    com32sys_t regs;
+
+    sem_down(&pxe_sem, 0);
+
+#if 0
+    dprintf("pxe_call op %04x data %p\n", opcode, data);
+#endif
+
+    memset(&regs, 0, sizeof regs);
+    regs.ebx.w[0] = opcode;
+    regs.es       = SEG(data);
+    regs.edi.w[0] = OFFS(data);
+    call16(pxenv, &regs, &regs);
+
+    sem_up(&pxe_sem);
+
+    return regs.eflags.l & EFLAGS_CF;  /* CF SET if fail */
+}
diff --git a/core/pxeboot.c b/core/bios/pxe/pxeboot.c
similarity index 97%
rename from core/pxeboot.c
rename to core/bios/pxe/pxeboot.c
index d9960d81..94d345bd 100644
--- a/core/pxeboot.c
+++ b/core/bios/pxe/pxeboot.c
@@ -10,7 +10,7 @@
  */
 
 #include <syslinux/video.h>
-#include "pxe.h"
+#include "core_pxe.h"
 #include <com32.h>
 
 #define LOCALBOOT_MSG	"Booting from local disk..."
diff --git a/core/pxeisr.inc b/core/bios/pxeisr.inc
similarity index 100%
rename from core/pxeisr.inc
rename to core/bios/pxeisr.inc
diff --git a/core/pxelinux-c.c b/core/bios/pxelinux-c.c
similarity index 100%
rename from core/pxelinux-c.c
rename to core/bios/pxelinux-c.c
diff --git a/core/bios/pxelinux.asm b/core/bios/pxelinux.asm
new file mode 100644
index 00000000..4cfdf1a2
--- /dev/null
+++ b/core/bios/pxelinux.asm
@@ -0,0 +1,2 @@
+%define IS_LPXELINUX 0
+%include "pxelinux.inc"
diff --git a/core/pxelinux.asm b/core/bios/pxelinux.inc
similarity index 99%
rename from core/pxelinux.asm
rename to core/bios/pxelinux.inc
index a2543dfe..be786369 100644
--- a/core/pxelinux.asm
+++ b/core/bios/pxelinux.inc
@@ -203,11 +203,6 @@ ROOT_FS_OPS:
 		pm_call load_env32
 		jmp kaboom		; load_env32() shouldn't return. If it does, then kaboom!
 
-print_hello:
-enter_command:
-auto_boot:
-		pm_call hello
-
 ;
 ; Save hardwired DHCP options.  This is done before the C environment
 ; is initialized, so it has to be done in assembly.
diff --git a/core/rawcon.c b/core/bios/rawcon.c
similarity index 100%
rename from core/rawcon.c
rename to core/bios/rawcon.c
diff --git a/core/regdump.inc b/core/bios/regdump.inc
similarity index 100%
rename from core/regdump.inc
rename to core/bios/regdump.inc
diff --git a/core/rllpack.c b/core/bios/rllpack.c
similarity index 100%
rename from core/rllpack.c
rename to core/bios/rllpack.c
diff --git a/core/serirq.c b/core/bios/serirq.c
similarity index 100%
rename from core/serirq.c
rename to core/bios/serirq.c
diff --git a/core/stack.inc b/core/bios/stack.inc
similarity index 100%
rename from core/stack.inc
rename to core/bios/stack.inc
diff --git a/core/strcpy.inc b/core/bios/strcpy.inc
similarity index 100%
rename from core/strcpy.inc
rename to core/bios/strcpy.inc
diff --git a/core/i386/syslinux.ld b/core/bios/syslinux.ld
similarity index 100%
rename from core/i386/syslinux.ld
rename to core/bios/syslinux.ld
diff --git a/core/timer.inc b/core/bios/timer.inc
similarity index 100%
rename from core/timer.inc
rename to core/bios/timer.inc
diff --git a/core/tracers.inc b/core/bios/tracers.inc
similarity index 100%
rename from core/tracers.inc
rename to core/bios/tracers.inc
diff --git a/core/writedec.inc b/core/bios/writedec.inc
similarity index 100%
rename from core/writedec.inc
rename to core/bios/writedec.inc
diff --git a/core/writehex.inc b/core/bios/writehex.inc
similarity index 100%
rename from core/writehex.inc
rename to core/bios/writehex.inc
diff --git a/core/conio.c b/core/conio.c
index e5e0ca76..e1c14987 100644
--- a/core/conio.c
+++ b/core/conio.c
@@ -29,271 +29,11 @@
 #include <x86/cpu.h>
 #include <syslinux/firmware.h>
 
-#include "bios.h"
-#include "graphics.h"
-
-union screen _cursor;
-union screen _screensize;
-
-/*
- * Serial console stuff.
- */
-__export uint16_t SerialPort = 0;   /* Serial port base (or 0 for no serial port) */
-__export uint8_t FlowInput = 0;	    /* Input bits for serial flow */
-__export uint16_t BaudDivisor = 115200/9600; /* Baud rate divisor */
-__export uint8_t FlowIgnore = 0;    /* Ignore input unless these bits set */
-__export uint16_t DisplayCon = 0x01;	/* Display console enabled */
-__export uint8_t FlowOutput = 0;	/* Output to assert for serial flow */
-
-__export uint8_t DisplayMask = 0x07;	/* Display modes mask */
-
-uint8_t ScrollAttribute = 0x07; /* Grey on white (normal text color) */
-
-/*
- * loadkeys:	Load a LILO-style keymap
- *
- * Returns 0 on success, or -1 on error.
- */
-__export int loadkeys(const char *filename)
-{
-	FILE *f;
-
-	f = fopen(filename, "r");
-	if (!f)
-		return -1;
-
-	fread(KbdMap, 1, sizeof(KbdMap), f);
-
-	fclose(f);
-	return 0;
-}
-
-/*
- * write_serial: If serial output is enabled, write character on
- * serial port.
- */
-__export void write_serial(char data)
-{
-	if (!SerialPort)
-		return;
-
-	if (!(DisplayMask & 0x04))
-		return;
-
-	while (1) {
-		char ch;
-
-		ch = inb(SerialPort + 5); /* LSR */
-
-		/* Wait for space in transmit register */
-		if (!(ch & 0x20))
-			continue;
-
-		/* Wait for input flow control */
-		ch = inb(SerialPort + 6);
-		ch &= FlowInput;
-		if (ch != FlowInput)
-			continue;
-
-		break;
-	}
-
-	outb(data, SerialPort);	/* Send data */
-	io_delay();
-}
-
-void pm_write_serial(com32sys_t *regs)
-{
-	write_serial(regs->eax.b[0]);
-}
-
-void serialcfg(uint16_t *iobase, uint16_t *divisor, uint16_t *flowctl)
-{
-	uint8_t al, ah;
-
-	*iobase = SerialPort;
-	*divisor = BaudDivisor;
-
-	al = FlowOutput;
-	ah = FlowInput;
-
-	al |= ah;
-	ah = FlowIgnore;
-	ah >>= 4;
-
-	if (!DisplayCon)
-		ah |= 0x80;
-
-	*flowctl = al | (ah << 8);
-}
-
-void pm_serialcfg(com32sys_t *regs)
-{
-	serialcfg(&regs->eax.w[0], &regs->ecx.w[0], &regs->ebx.w[0]);
-}
-
-/*
- * write_serial_str: write_serial for strings
- */
-__export void write_serial_str(char *data)
-{
-	char ch;
-
-	while ((ch = *data++))
-		write_serial(ch);
-}
-
-/*
- * pollchar: check if we have an input character pending
- *
- * Returns 1 if character pending.
- */
-int bios_pollchar(void)
-{
-	com32sys_t ireg, oreg;
-	uint8_t data = 0;
-
-	memset(&ireg, 0, sizeof(ireg));
-
-	ireg.eax.b[1] = 0x11;	/* Poll keyboard */
-	__intcall(0x16, &ireg, &oreg);
-
-	if (!(oreg.eflags.l & EFLAGS_ZF))
-		return 1;
-
-	if (SerialPort) {
-		cli();
-
-		/* Already-queued input? */
-		if (SerialTail == SerialHead) {
-			/* LSR */
-			data = inb(SerialPort + 5) & 1;
-			if (data) {
-				/* MSR */
-				data = inb(SerialPort + 6);
-
-				/* Required status bits */
-				data &= FlowIgnore;
-
-				if (data == FlowIgnore)
-					data = 1;
-				else
-					data = 0;
-			}
-		} else
-			data = 1;
-		sti();
-	}
-
-	return data;
-}
-
 __export int pollchar(void)
 {
 	return firmware->i_ops->pollchar();
 }
 
-void pm_pollchar(com32sys_t *regs)
-{
-	if (pollchar())
-		regs->eflags.l &= ~EFLAGS_ZF;
-	else
-		regs->eflags.l |= EFLAGS_ZF;
-}
-
-char bios_getchar(char *hi)
-{
-	com32sys_t ireg, oreg;
-	unsigned char data;
-
-	memset(&ireg, 0, sizeof(ireg));
-	memset(&oreg, 0, sizeof(oreg));
-	while (1) {
-		__idle();
-
-		ireg.eax.b[1] = 0x11;	/* Poll keyboard */
-		__intcall(0x16, &ireg, &oreg);
-
-		if (oreg.eflags.l & EFLAGS_ZF) {
-			if (!SerialPort)
-				continue;
-
-			cli();
-			if (SerialTail != SerialHead) {
-				/* serial queued */
-				sti(); /* We already know we'll consume data */
-				data = *SerialTail++;
-
-				if (SerialTail > SerialHead + serial_buf_size)
-					SerialTail = SerialHead;
-			} else {
-				/* LSR */
-				data = inb(SerialPort + 5) & 1;
-				if (!data) {
-					sti();
-					continue;
-				}
-				data = inb(SerialPort + 6);
-				data &= FlowIgnore;
-				if (data != FlowIgnore) {
-					sti();
-					continue;
-				}
-
-				data = inb(SerialPort);
-				sti();
-				break;
-			}
-		} else {
-			/* Keyboard input? */
-			ireg.eax.b[1] = 0x10; /* Get keyboard input */
-			__intcall(0x16, &ireg, &oreg);
-
-			data = oreg.eax.b[0];
-			*hi = oreg.eax.b[1];
-
-			if (data == 0xE0)
-				data = 0;
-
-			if (data) {
-				/* Convert character sets */
-				data = KbdMap[data];
-			}
-		}
-
-		break;
-	}
-
-	reset_idle();		/* Character received */
-	return data;
-}
-
-uint8_t bios_shiftflags(void)
-{
-	com32sys_t reg;
-	uint8_t ah, al;
-
-	memset(&reg, 0, sizeof reg);
-	reg.eax.b[1] = 0x12;
-	__intcall(0x16, &reg, &reg);
-	ah = reg.eax.b[1];
-	al = reg.eax.b[0];
-
-	/*
-	 * According to the Interrupt List, "many machines" don't correctly
-	 * fold the Alt state, presumably because it might be AltGr.
-	 * Explicitly fold the Alt and Ctrl states; it fits our needs
-	 * better.
-	 */
-
-	if (ah & 0x0a)
-		al |= 0x08;
-	if (ah & 0x05)
-		al |= 0x04;
-
-	return al;
-}
-
 __export uint8_t kbd_shiftflags(void)
 {
 	if (firmware->i_ops->shiftflags)
@@ -309,8 +49,3 @@ __export char getchar(char *hi)
 {
 	return firmware->i_ops->getchar(hi);
 }
-
-void pm_getchar(com32sys_t *regs)
-{
-	regs->eax.b[0] = getchar((char *)&regs->eax.b[1]);
-}
diff --git a/core/elflink/elfutils.h b/core/elflink/elfutils.h
index 3c8e70fc..f641b119 100644
--- a/core/elflink/elfutils.h
+++ b/core/elflink/elfutils.h
@@ -8,20 +8,20 @@
  * elf_get_header - Returns a pointer to the ELF header structure.
  * @elf_image: pointer to the ELF file image in memory
  */
-static inline Elf32_Ehdr *elf_get_header(void *elf_image)
+static inline Elf_Ehdr *elf_get_header(void *elf_image)
 {
-    return (Elf32_Ehdr *) elf_image;
+    return (Elf_Ehdr *) elf_image;
 }
 
 /**
  * elf_get_pht - Returns a pointer to the first entry in the PHT.
  * @elf_image: pointer to the ELF file image in memory
  */
-static inline Elf32_Phdr *elf_get_pht(void *elf_image)
+static inline Elf_Phdr *elf_get_pht(void *elf_image)
 {
-    Elf32_Ehdr *elf_hdr = elf_get_header(elf_image);
+    Elf_Ehdr *elf_hdr = elf_get_header(elf_image);
 
-    return (Elf32_Phdr *) ((Elf32_Off) elf_hdr + elf_hdr->e_phoff);
+    return (Elf_Phdr *) ((Elf_Off) elf_hdr + elf_hdr->e_phoff);
 }
 
 //
@@ -30,12 +30,12 @@ static inline Elf32_Phdr *elf_get_pht(void *elf_image)
  * @elf_image: pointer to the ELF file image in memory
  * @index: the index of the PHT entry to look for
  */
-static inline Elf32_Phdr *elf_get_ph(void *elf_image, int index)
+static inline Elf_Phdr *elf_get_ph(void *elf_image, int index)
 {
-    Elf32_Phdr *elf_pht = elf_get_pht(elf_image);
-    Elf32_Ehdr *elf_hdr = elf_get_header(elf_image);
+    Elf_Phdr *elf_pht = elf_get_pht(elf_image);
+    Elf_Ehdr *elf_hdr = elf_get_header(elf_image);
 
-    return (Elf32_Phdr *) ((Elf32_Off) elf_pht + index * elf_hdr->e_phentsize);
+    return (Elf_Phdr *) ((Elf_Off) elf_pht + index * elf_hdr->e_phentsize);
 }
 
 /**
diff --git a/core/fs/ext2/ext2.c b/core/fs/ext2/ext2.c
index 4bc0a535..6ff63642 100644
--- a/core/fs/ext2/ext2.c
+++ b/core/fs/ext2/ext2.c
@@ -29,7 +29,7 @@ static const void *__ext2_get_group_desc(struct fs_info *fs, uint32_t group_num)
 {
     struct ext2_sb_info *sbi = EXT2_SB(fs);
     uint32_t desc_block, desc_index;
-    uint8_t *p;
+    const uint8_t *p;
 
     if (group_num >= sbi->s_groups_count) {
 	printf ("ext2_get_group_desc"
diff --git a/core/fs/ntfs/ntfs.c b/core/fs/ntfs/ntfs.c
index 4c0a09c8..54213668 100644
--- a/core/fs/ntfs/ntfs.c
+++ b/core/fs/ntfs/ntfs.c
@@ -671,8 +671,6 @@ static int index_inode_setup(struct fs_info *fs, unsigned long mft_no,
         NTFS_PVT(inode)->type = attr->type;
 
         if (!attr->non_resident) {
-            NTFS_PVT(inode)->data.resident.offset =
-                (uint32_t)((uint8_t *)attr + attr->data.resident.value_offset);
             inode->size = attr->data.resident.value_len;
         } else {
             attr_len = (uint8_t *)attr + attr->len;
diff --git a/core/fs/ntfs/ntfs.h b/core/fs/ntfs/ntfs.h
index 721a78d7..ec1dc120 100644
--- a/core/fs/ntfs/ntfs.h
+++ b/core/fs/ntfs/ntfs.h
@@ -86,9 +86,6 @@ struct ntfs_inode {
     uint32_t type;              /* Attribute type of this inode */
     uint8_t non_resident;
     union {                 /* Non-resident $DATA attribute */
-        struct {            /* Used only if non_resident flags isn't set */
-            uint32_t offset;    /* Data offset */
-        } resident;
         struct {            /* Used only if non_resident is set */
             struct runlist *rlist;
         } non_resident;
diff --git a/core/fs/pxe/dhcp_option.c b/core/fs/pxe/dhcp_option.c
index 1b8ec9d8..88102cbe 100644
--- a/core/fs/pxe/dhcp_option.c
+++ b/core/fs/pxe/dhcp_option.c
@@ -4,7 +4,7 @@
 #include <x86/cpu.h>
 #include <lwip/opt.h>		/* DNS_MAX_SERVERS */
 #include <dprintf.h>
-#include "pxe.h"
+#include "core_pxe.h"
 
 char LocalDomain[256];
 
@@ -231,13 +231,10 @@ void parse_dhcp(const void *pkt, size_t pkt_len, int pkt_type)
 {
     const struct bootp_t *dhcp = (const struct bootp_t *)pkt;
     int opt_len;
-    int min_opt = 0;
 
     IPInfo.ipver = 4;		/* This is IPv4 only for now... */
 
     over_load = 0;
-    if (pkt_type == 1 || pkt_type == 3)
-	min_opt = 43;
     if ((pkt_type == 2) && ip_ok(dhcp->yip))
         IPInfo.myip = dhcp->yip;
 
diff --git a/core/fs/pxe/ftp.c b/core/fs/pxe/ftp.c
index 947f2899..6893e540 100644
--- a/core/fs/pxe/ftp.c
+++ b/core/fs/pxe/ftp.c
@@ -23,7 +23,7 @@
 #include <lwip/api.h>
 #include "core.h"
 #include "fs.h"
-#include "pxe.h"
+#include "core_pxe.h"
 #include "thread.h"
 #include "url.h"
 #include "net.h"
diff --git a/core/fs/pxe/ftp_readdir.c b/core/fs/pxe/ftp_readdir.c
index 6b87f77e..04091cf2 100644
--- a/core/fs/pxe/ftp_readdir.c
+++ b/core/fs/pxe/ftp_readdir.c
@@ -18,7 +18,7 @@
 #include <stdlib.h>
 #include <ctype.h>
 #include <dprintf.h>
-#include "pxe.h"
+#include "core_pxe.h"
 
 static int dirtype(char type)
 {
diff --git a/core/fs/pxe/gpxeurl.c b/core/fs/pxe/gpxeurl.c
index d030a803..5b8414fe 100644
--- a/core/fs/pxe/gpxeurl.c
+++ b/core/fs/pxe/gpxeurl.c
@@ -1,10 +1,11 @@
-#include "pxe.h"
-#if GPXE
+/*
+ * Dummy gPXE stub
+ */
 
-void gpxe_open(struct inode *inode, const char *url)
+#include "core_pxe.h"
+
+void __attribute__((weak)) gpxe_open(struct inode *inode, const char *url)
 {
     (void)inode;
     (void)url;
 }
-
-#endif /* GPXE */
diff --git a/core/fs/pxe/http.c b/core/fs/pxe/http.c
index f5f49e2b..5b8fce11 100644
--- a/core/fs/pxe/http.c
+++ b/core/fs/pxe/http.c
@@ -1,7 +1,7 @@
 #include <syslinux/sysappend.h>
 #include <ctype.h>
 #include <lwip/api.h>
-#include "pxe.h"
+#include "core_pxe.h"
 #include "version.h"
 #include "url.h"
 #include "net.h"
diff --git a/core/fs/pxe/http_readdir.c b/core/fs/pxe/http_readdir.c
index b6e480e7..88496201 100644
--- a/core/fs/pxe/http_readdir.c
+++ b/core/fs/pxe/http_readdir.c
@@ -15,7 +15,7 @@
 #include <stdlib.h>
 #include <ctype.h>
 #include <dprintf.h>
-#include "pxe.h"
+#include "core_pxe.h"
 
 enum http_readdir_state {
     st_start,			/*  0 Initial state */
diff --git a/core/fs/pxe/idle.c b/core/fs/pxe/idle.c
index dbc5b9ab..d767009a 100644
--- a/core/fs/pxe/idle.c
+++ b/core/fs/pxe/idle.c
@@ -11,19 +11,23 @@
  *
  * ----------------------------------------------------------------------- */
 
+/*
+ * Fallback empty idle routine, marked weak so it can be overridden
+ */
+
 #include <stdio.h>
 #include <string.h>
 #include <core.h>
 #include <fs.h>
 #include <minmax.h>
 #include <x86/cpu.h>
-#include "pxe.h"
+#include "core_pxe.h"
 
-void pxe_idle_init(void)
+void __attribute__((weak)) pxe_idle_init(void)
 {
 }
 
-void pxe_idle_cleanup(void)
+void __attribute__((weak)) pxe_idle_cleanup(void)
 {
     idle_hook_func = NULL;
 }
diff --git a/core/fs/pxe/pxe.c b/core/fs/pxe/pxe.c
index 685fcc8f..a8f38559 100644
--- a/core/fs/pxe/pxe.c
+++ b/core/fs/pxe/pxe.c
@@ -5,7 +5,7 @@
 #include <fs.h>
 #include <fcntl.h>
 #include <x86/cpu.h>
-#include "pxe.h"
+#include "core_pxe.h"
 #include "thread.h"
 #include "url.h"
 #include "tftp.h"
@@ -98,33 +98,6 @@ static int gendotquad(char *dst, uint32_t ip)
 		   ((const uint8_t *)&ip)[3]);
 }
 
-/*
- * the ASM pxenv function wrapper, return 1 if error, or 0
- *
- */
-__export int pxe_call(int opcode, void *data)
-{
-    static DECLARE_INIT_SEMAPHORE(pxe_sem, 1);
-    extern void pxenv(void);
-    com32sys_t regs;
-
-    sem_down(&pxe_sem, 0);
-
-#if 0
-    dprintf("pxe_call op %04x data %p\n", opcode, data);
-#endif
-
-    memset(&regs, 0, sizeof regs);
-    regs.ebx.w[0] = opcode;
-    regs.es       = SEG(data);
-    regs.edi.w[0] = OFFS(data);
-    call16(pxenv, &regs, &regs);
-
-    sem_up(&pxe_sem);
-
-    return regs.eflags.l & EFLAGS_CF;  /* CF SET if fail */
-}
-
 /*
  * mangle a filename pointed to by _src_ into a buffer pointed
  * to by _dst_; ends on encountering any whitespace.
diff --git a/core/fs/pxe/tftp.c b/core/fs/pxe/tftp.c
index 594152b9..472988b4 100644
--- a/core/fs/pxe/tftp.c
+++ b/core/fs/pxe/tftp.c
@@ -1,6 +1,6 @@
 #include <minmax.h>
 #include <net.h>
-#include "pxe.h"
+#include "core_pxe.h"
 #include "url.h"
 #include "tftp.h"
 
diff --git a/core/fs/pxe/pxe.h b/core/include/core_pxe.h
similarity index 100%
rename from core/fs/pxe/pxe.h
rename to core/include/core_pxe.h
diff --git a/core/strcasecmp.c b/core/strcasecmp.c
deleted file mode 100644
index 2f7480d4..00000000
--- a/core/strcasecmp.c
+++ /dev/null
@@ -1,11 +0,0 @@
-/*
- * strcasecmp.c
- */
-
-#include <string.h>
-#include <ctype.h>
-
-int strcasecmp(const char *s1, const char *s2)
-{
-    return strncasecmp(s1, s2, -1);
-}
diff --git a/core/hello.c b/core/tests/hello.c
similarity index 100%
rename from core/hello.c
rename to core/tests/hello.c
diff --git a/diag/geodsp/Makefile b/diag/geodsp/Makefile
index 73e4429e..92d6be2d 100644
--- a/diag/geodsp/Makefile
+++ b/diag/geodsp/Makefile
@@ -19,7 +19,7 @@
 #
 
 include $(MAKEDIR)/embedded.mk
-coredir = $(topdir)/core
+coredir = $(topdir)/core/bios
 VPATH = $(SRC)
 
 BTARGET = geodsp1s.bin geodsp1s_f.bin geodspms.bin \
@@ -28,7 +28,7 @@ BTARGET = geodsp1s.bin geodsp1s_f.bin geodspms.bin \
 NASMOPT = -i $(coredir)/ -i $(SRC)/ -Ox -f bin -dBINFMT
 NASMOPT += -w+orphan-labels
 CFLAGS = -g -O
-LIBS = $(coredir)/writehex.inc $(coredir)/macros.inc $(coredir)/diskboot.inc geodsplib.inc
+LIBS = $(wildcard $(coredir)/*.inc)
 
 all: $(BTARGET)
 
diff --git a/efi/Makefile b/efi/Makefile
index f4501e7f..00fab618 100644
--- a/efi/Makefile
+++ b/efi/Makefile
@@ -19,29 +19,16 @@ CC_FOR_BUILD ?= $(CC)
 # Upstream gnu-efi has old-style function definitions.
 CFLAGS += -Wno-strict-prototypes
 
-CORE_CSRC := $(sort $(wildcard $(core)/*.c $(core)/*/*.c $(core)/*/*/*.c))
+CORE_CSRC := $(sort $(shell find '$(core)' -name '*.c' -print))
 CORE_COBJ := $(subst $(core),$(OBJ)/../core,$(patsubst %.c,%.o,$(CORE_CSRC)))
 
 # We don't want to include any of the networking stack or the thread
 # code since it will be implemented completely differently for EFI.
-FILTERED_OBJS:= $(sort $(subst $(core),$(OBJ)/../core,$(patsubst %.c,%.o, \
-	$(wildcard $(core)/legacynet/*.c) \
-	$(wildcard $(core)/fs/pxe/*.c) \
-	$(wildcard $(core)/thread/*.c))))
-
-# Don't include unit tests
-FILTERED_OBJS += $(subst $(core),$(OBJ)/../core, \
-	$(patsubst %.c,%.o,$(shell find $(core) -path "*/tests/*.c" -print)))
-
-# Don't include console objects
-CORE_OBJS = $(filter-out %hello.o %rawcon.o %plaincon.o %strcasecmp.o %bios.o \
-	%diskio_bios.o %ldlinux-c.o %isolinux-c.o %pxelinux-c.o \
-	%localboot.o %pxeboot.o \
-	$(FILTERED_OBJS),$(CORE_COBJ) $(CORE_SOBJ))
-
-CORE_OBJS += $(addprefix $(OBJ)/../core/, \
-	fs/pxe/pxe.o fs/pxe/tftp.o fs/pxe/urlparse.o fs/pxe/dhcp_option.o \
-	fs/pxe/ftp.o fs/pxe/ftp_readdir.o fs/pxe/http.o fs/pxe/http_readdir.o)
+FILTERED_OBJS := $(OBJ)/../core/bios/% \
+		 $(patsubst $(core)/%,$(OBJ)/../core/%/%,\
+			$(shell find '$(core)' -type d -name tests))
+
+CORE_OBJS = $(filter-out $(FILTERED_OBJS),$(CORE_COBJ))
 
 LIB_OBJS = $(addprefix $(objdir)/com32/lib/,$(CORELIBOBJS)) \
 	$(LIBEFI)
diff --git a/efi/main.c b/efi/main.c
index 92546de6..6a748412 100644
--- a/efi/main.c
+++ b/efi/main.c
@@ -169,9 +169,11 @@ void efi_destroy_binding(struct efi_binding *b, EFI_GUID *guid)
     free(b);
 }
 
-#undef kaboom
-void kaboom(void)
+__export __noreturn _kaboom(void)
 {
+    /* Return to EFI here somehow? */
+    for (;;)
+	asm volatile("hlt");
 }
 
 void printf_init(void)
@@ -1237,7 +1239,10 @@ bail:
 }
 
 extern struct disk *efi_disk_init(EFI_HANDLE);
-extern void serialcfg(uint16_t *, uint16_t *, uint16_t *);
+static void serialcfg(uint16_t *iobase, uint16_t *divisor, uint16_t *flowctl)
+{
+    *iobase = *divisor = *flowctl = 0;
+}
 
 extern struct vesa_ops efi_vesa_ops;
 
diff --git a/efi/pxe.c b/efi/pxe.c
index 6e59109b..5b552b39 100644
--- a/efi/pxe.c
+++ b/efi/pxe.c
@@ -6,7 +6,7 @@
 #include <syslinux/pxe_api.h>
 #include "efi.h"
 #include "net.h"
-#include "fs/pxe/pxe.h"
+#include "core_pxe.h"
 
 const struct url_scheme url_schemes[] = {
     { "tftp", tftp_open, 0 },
diff --git a/efi/tcp.c b/efi/tcp.c
index 0e9140e4..6ac4f0d3 100644
--- a/efi/tcp.c
+++ b/efi/tcp.c
@@ -4,7 +4,7 @@
 
 #include "efi.h"
 #include "net.h"
-#include "fs/pxe/pxe.h"
+#include "core_pxe.h"
 
 extern EFI_GUID Tcp4ServiceBindingProtocol;
 extern EFI_GUID Tcp4Protocol;
diff --git a/efi/udp.c b/efi/udp.c
index 288010cf..be2f2f2a 100644
--- a/efi/udp.c
+++ b/efi/udp.c
@@ -6,7 +6,7 @@
 #include <minmax.h>
 #include "efi.h"
 #include "net.h"
-#include "fs/pxe/pxe.h"
+#include "core_pxe.h"
 
 extern EFI_GUID Udp4ServiceBindingProtocol, Udp4Protocol;
 
diff --git a/mk/syslinux.mk b/mk/syslinux.mk
index d4a2e079..593ff75f 100644
--- a/mk/syslinux.mk
+++ b/mk/syslinux.mk
@@ -1,4 +1,4 @@
-## -*- makefile -*- -------------------------------------------------------
+## -*- makefile -*- ------------------------------------------------------
 ##   
 ##   Copyright 2008 H. Peter Anvin - All Rights Reserved
 ##
@@ -80,14 +80,17 @@ ARCH ?= $(strip $(SUBARCH))
 
 # Common warnings we want for all gcc-generated code
 # WARNOPT is available for the user to specify additional warning flags
-GCCWARN = -W -Wall -Wstrict-prototypes $(DEBUGOPT) $(WARNOPT)
+GCCWARN = -W -Wall -Wstrict-prototypes \
+	  -Wno-implicit-fallthrough -Wno-format-truncation \
+	  -Wno-stringop-overflow \
+	  $(DEBUGOPT) $(WARNOPT)
 
 # Common stanza to make gcc generate .*.d dependency files
-MAKEDEPS = -MT $@ -MD -MF $(dir $@).$(notdir $@).d
+MAKEDEPS = -MT $@ -MD -MF $(@D)/.$(@F).d
 
 # Dependencies that exclude system headers; use whenever we use
 # header files from the platform.
-UMAKEDEPS = -MT $@ -MMD -MF $(dir $@).$(notdir $@).d
+UMAKEDEPS = -MT $@ -MMD -MF $(@D)/.$(@F).d
 
 # Items that are only appropriate during development; this file is
 # removed when tarballs are generated.


More information about the Syslinux-commits mailing list