[syslinux:wip.makefixes] WIP: another snapshot; now fails building the efi32 ldlinux.e32

syslinux-bot for H. Peter Anvin hpa at zytor.com
Fri Mar 1 00:33:05 PST 2019


Commit-ID:  a89d436eda9c260745dd3a772d8bcc193566c809
Gitweb:     https://www.syslinux.org/commit/a89d436eda9c260745dd3a772d8bcc193566c809
Author:     H. Peter Anvin <hpa at zytor.com>
AuthorDate: Fri, 1 Mar 2019 00:31:40 -0800
Committer:  H. Peter Anvin <hpa at zytor.com>
CommitDate: Fri, 1 Mar 2019 00:31:40 -0800

WIP: another snapshot; now fails building the efi32 ldlinux.e32


---
 com32/include/com32.h                  | 15 ----------
 core/Makefile                          |  6 +++-
 core/Makefile.bios                     |  2 --
 core/Makefile.efi                      | 24 +++++----------
 core/bios/bios.c                       | 13 +--------
 core/{ => bios}/mem/free.c             | 45 ++---------------------------
 core/{ => bios}/mem/init.c             |  0
 core/{ => bios}/mem/malloc.c           | 53 +++++-----------------------------
 core/{ => bios}/mem/malloc.h           |  0
 core/{ => bios}/mem/tests/Makefile     |  0
 core/{ => bios}/mem/tests/meminit.c    |  0
 core/common/pmapi.c                    | 46 -----------------------------
 core/common/zalloc.c                   | 18 ++++++++++++
 core/efi/{ => arch}/i386/linux.S       |  0
 core/efi/{ => arch}/i386/syslinux.ld   |  0
 core/efi/{ => arch}/x86_64/linux.S     |  0
 core/efi/{ => arch}/x86_64/syslinux.ld |  0
 core/efi/main.c                        |  9 ------
 core/efi/mem.c                         | 26 ++++++++++++-----
 19 files changed, 61 insertions(+), 196 deletions(-)

diff --git a/com32/include/com32.h b/com32/include/com32.h
index a46284bb..0a1e75a2 100644
--- a/com32/include/com32.h
+++ b/com32/include/com32.h
@@ -74,21 +74,6 @@ typedef struct {
     reg32_t eflags;		/* Offset 40 */
 } com32sys_t;
 
-struct com32_pmapi;
-
-extern struct com32_sys_args {
-    uint32_t cs_sysargs;
-    char *cs_cmdline;
-    void __cdecl (*cs_intcall)(uint8_t, const com32sys_t *, com32sys_t *);
-    void *cs_bounce;
-    uint32_t cs_bounce_size;
-    void __cdecl (*cs_farcall)(uint32_t, const com32sys_t *, com32sys_t *);
-    int __cdecl (*cs_cfarcall)(uint32_t, const void *, uint32_t);
-    uint32_t cs_memsize;
-    const char *cs_name;
-    const struct com32_pmapi *cs_pm;
-} __com32;
-
 extern const com32sys_t __com32_zero_regs;
 
 /*
diff --git a/core/Makefile b/core/Makefile
index b6d74166..2f5cac5f 100644
--- a/core/Makefile
+++ b/core/Makefile
@@ -39,7 +39,10 @@ PREPCORE  = $(objdir)/prepcore/$(fwclass)/prepcore
 
 # All primary source files for the main syslinux files
 SRCFILES  := $(sort $(shell find $(SRCDIRS:%=$(SRC)/%) \
-	      -name tests -prune -o -type f -print))
+	        -name tests   -type d -prune -o \
+		-name $(ARCH) -type d -true  -o \
+		-regex '.*/arch/[^/]+' -type d -prune -o \
+		-type f -print))
 NASMSRC	  := $(filter %.asm,$(SRCFILES))
 NASMHDR	  := $(filter %.inc,$(SRCFILES))
 CSRC	  := $(filter %.c  ,$(SRCFILES))
@@ -81,6 +84,7 @@ DATE    := $(shell sh $(SRC)/../gen-id.sh $(VERSION) $(HEXDATE))
 endif
 
 CORELDSCRIPT ?= $(SRC)/$(fwclass)/syslinux.ld
+CORE_LIBOBJS := $(filter-out $(FILTER_DIRS:%=%/%.o),$(ALLOBJ))
 
 CORELDFLAGS += $(MAIN_LDFLAGS) -pie --no-dynamic-linker \
 	--unresolved-symbols=report-all \
diff --git a/core/Makefile.bios b/core/Makefile.bios
index ea33f9cc..f3ade9aa 100644
--- a/core/Makefile.bios
+++ b/core/Makefile.bios
@@ -38,8 +38,6 @@ LPXELINUX_OBJS  := $(filter $(LPXELINUX_DIRS:%=%/%.o),$(ALLOBJ))
 PXELINUX_OBJS   := $(filter $(PXELINUX_DIRS:%=%/%.o),$(ALLOBJ))
 MAIN_OBJS       := $(filter $(MAIN_DIRS:%=%/%.o),$(ALLOBJ))
 
-CORE_LIBOBJS    := $(filter-out $(FILTER_DIRS:%=%/%.o),$(ALLOBJ))
-
 AUXLIBS      	:= bios/pxelinux.a bios/lpxelinux.a
 CORELDSCRIPT	:= $(SRC)/bios/syslinux.ld
 
diff --git a/core/Makefile.efi b/core/Makefile.efi
index dce513ed..7b1db7a4 100644
--- a/core/Makefile.efi
+++ b/core/Makefile.efi
@@ -21,14 +21,12 @@ BTARGET  = syslinux.efi
 # The corresponding ELF files
 ETARGET  = efi/syslinux.elf
 
-# Export library files
-LIBCORE_FILES = libcore.so libcore.weak
-
-CORE_LIBOBJS  = $(ALLOBJ)
-
 CORELDFLAGS =
 CORE_LIB	= efi/libsyslinux.a
 
+CORE_LIBS += $(objdir)/com32/efi/lib/libgnuefi.a \
+	     $(objdir)/com32/efi/lib/libefi.a
+
 INCLUDE += -I$(SRC)/efi
 CFLAGS  += $(DATE_DEFS)
 
@@ -36,15 +34,9 @@ CFLAGS  += $(DATE_DEFS)
 syslinux.efi: efi/syslinux.elf $(PREPCORE)
 	$(PREPCORE) $< $@
 
-wrapper: wrapper.c wrapper.h
-	$(CC_FOR_BUILD) $(CFLAGS_FOR_BUILD) -o $@ $< $(LIBS_FOR_BUILD)
-
-CORELDSCRIPT = $(LDSCRIPT)
-
-# Assembly file to force certain symbols to be exported even if
-# they are not used by the core.
-EXPORT = export.o
+CORELDSCRIPT = $(SRC)/efi/arch/$(ARCH)/syslinux.ld
 
-$(ETARGET): $(CORE_LIB)
-	$(LD) $(CORELDFLAGS) --strip-debug -o $@ $^ \
-		-L$(objdir)/com32/efi/lib -lgnuefi -lefi
+$(ETARGET): $(CORE_LIB) $(CORE_LIBS) $(CORELDSCRIPT)
+	$(LD) $(CORELDFLAGS) --strip-debug -o $@ \
+		--whole-archive $(CORE_LIB) --no-whole-archive \
+		--start-group $(CORE_LIBS) --end-group > $*.map
diff --git a/core/bios/bios.c b/core/bios/bios.c
index 7fb37fec..ed2e52f8 100644
--- a/core/bios/bios.c
+++ b/core/bios/bios.c
@@ -690,16 +690,6 @@ static void bios_cleanup_hardware(void)
 	sirq_cleanup();
 }
 
-extern void *bios_malloc(size_t, enum heap, size_t);
-extern void *bios_realloc(void *, size_t);
-extern void bios_free(void *);
-
-struct mem_ops bios_mem_ops = {
-	.malloc = bios_malloc,
-	.realloc = bios_realloc,
-	.free = bios_free,
-};
-
 struct firmware bios_fw = {
 	.init = bios_init,
 	.adjust_screen = bios_adjust_screen,
@@ -709,8 +699,7 @@ struct firmware bios_fw = {
 	.i_ops = &bios_input_ops,
 	.get_serial_console_info = bios_get_serial_console_info,
 	.adv_ops = &bios_adv_ops,
-	.vesa = &bios_vesa_ops,
-	.mem = &bios_mem_ops,
+	.vesa = &bios_vesa_ops
 };
 
 void syslinux_register_bios(void)
diff --git a/core/mem/free.c b/core/bios/mem/free.c
similarity index 77%
rename from core/mem/free.c
rename to core/bios/mem/free.c
index 21f9b59f..b9b554b7 100644
--- a/core/mem/free.c
+++ b/core/bios/mem/free.c
@@ -6,7 +6,6 @@
 
 #include <syslinux/firmware.h>
 #include <stdlib.h>
-#include <dprintf.h>
 #include "malloc.h"
 
 #include <stdio.h>
@@ -67,40 +66,16 @@ __free_block(struct free_arena_header *ah)
     return ah;
 }
 
-void bios_free(void *ptr)
+__export void free(void *ptr)
 {
     struct free_arena_header *ah;
 
     ah = (struct free_arena_header *)
         ((struct arena_header *)ptr - 1);
 
-#ifdef DEBUG_MALLOC
-    if (ah->a.magic != ARENA_MAGIC)
-	dprintf("failed free() magic check: %p\n", ptr);
-
-    if (ARENA_TYPE_GET(ah->a.attrs) != ARENA_TYPE_USED)
-	dprintf("invalid arena type: %d\n", ARENA_TYPE_GET(ah->a.attrs));
-#endif
-
     __free_block(ah);
 }
 
-__export void free(void *ptr)
-{
-#ifdef DEBUG_MALLOC
-    dprintf("free(%p) @ %p\n", ptr, __builtin_return_address(0));
-#endif
-
-    if ( !ptr )
-        return;
-
-    sem_down(&__malloc_semaphore, 0);
-    firmware->mem->free(ptr);
-    sem_up(&__malloc_semaphore);
-
-  /* Here we could insert code to return memory to the system. */
-}
-
 /*
  * This is used to insert a block which is not previously on the
  * free list.  Only the a.size field of the arena header is assumed
@@ -114,10 +89,6 @@ void __inject_free_block(struct free_arena_header *ah)
     size_t a_end = (size_t) ah + ARENA_SIZE_GET(ah->a.attrs);
     size_t n_end;
 
-    dprintf("inject: %#zx bytes @ %p, heap %u (%p)\n",
-	    ARENA_SIZE_GET(ah->a.attrs), ah,
-	    ARENA_HEAP_GET(ah->a.attrs), head);
-
     sem_down(&__malloc_semaphore, 0);
 
     for (nah = head->a.next ; nah != head ; nah = nah->a.next) {
@@ -131,8 +102,6 @@ void __inject_free_block(struct free_arena_header *ah)
         if ((size_t) ah >= n_end)
             continue;
 
-	printf("conflict:ah: %p, a_end: %p, nah: %p, n_end: %p\n", ah, a_end, nah, n_end);
-
         /* Otherwise we have some sort of overlap - reject this block */
 	sem_up(&__malloc_semaphore);
         return;
@@ -152,14 +121,14 @@ void __inject_free_block(struct free_arena_header *ah)
 /*
  * Free all memory which is tagged with a specific tag.
  */
-static void __free_tagged(malloc_tag_t tag) {
+__export void __free_tagged(malloc_tag_t tag)
+{
     struct free_arena_header *fp, *head;
     int i;
 
     sem_down(&__malloc_semaphore, 0);
 
     for (i = 0; i < NHEAP; i++) {
-	dprintf("__free_tagged(%u) heap %d\n", tag, i);
 	head = &__core_malloc_head[i];
 	for (fp = head->a.next ; fp != head ; fp = fp->a.next) {
 	    if (ARENA_TYPE_GET(fp->a.attrs) == ARENA_TYPE_USED &&
@@ -169,12 +138,4 @@ static void __free_tagged(malloc_tag_t tag) {
     }
 
     sem_up(&__malloc_semaphore);
-    dprintf("__free_tagged(%u) done\n", tag);
-}
-
-void comboot_cleanup_lowmem(com32sys_t *regs)
-{
-    (void)regs;
-
-    __free_tagged(MALLOC_MODULE);
 }
diff --git a/core/mem/init.c b/core/bios/mem/init.c
similarity index 100%
rename from core/mem/init.c
rename to core/bios/mem/init.c
diff --git a/core/mem/malloc.c b/core/bios/mem/malloc.c
similarity index 89%
rename from core/mem/malloc.c
rename to core/bios/mem/malloc.c
index 836c2fe3..807557d3 100644
--- a/core/mem/malloc.c
+++ b/core/bios/mem/malloc.c
@@ -67,12 +67,14 @@ static void *__malloc_from_block(struct free_arena_header *fp,
     return (void *)(&fp->a + 1);
 }
 
-void *bios_malloc(size_t size, enum heap heap, malloc_tag_t tag)
+static void *_malloc(size_t size, enum heap heap, malloc_tag_t tag)
 {
     struct free_arena_header *fp;
     struct free_arena_header *head = &__core_malloc_head[heap];
     void *p = NULL;
 
+    sem_down(&__malloc_semaphore, 0);
+
     if (size) {
 	/* Add the obligatory arena header, and round up */
 	size = (size + 2 * sizeof(struct arena_header) - 1) & ARENA_SIZE_MASK;
@@ -84,27 +86,10 @@ void *bios_malloc(size_t size, enum heap heap, malloc_tag_t tag)
 		break;
 	    }
         }
+	errno = ENOMEM;
     }
-
-    return p;
-}
-
-static void *_malloc(size_t size, enum heap heap, malloc_tag_t tag)
-{
-    void *p;
-
-#ifdef DEBUG_MALLOC
-    dprintf("_malloc(%zu, %u, %u) @ %p = ",
-	size, heap, tag, __builtin_return_address(0));
-#endif
-
-    sem_down(&__malloc_semaphore, 0);
-    p = firmware->mem->malloc(size, heap, tag);
     sem_up(&__malloc_semaphore);
 
-#ifdef DEBUG_MALLOC
-    dprintf("%p\n", p);
-#endif
     return p;
 }
 
@@ -117,18 +102,10 @@ __export void *lmalloc(size_t size)
 {
     void *p;
 
-    p = _malloc(size, HEAP_LOWMEM, MALLOC_CORE);
-    if (!p)
-	errno = ENOMEM;
-    return p;
+    return _malloc(size, HEAP_LOWMEM, MALLOC_CORE);
 }
 
-void *pmapi_lmalloc(size_t size)
-{
-    return _malloc(size, HEAP_LOWMEM, MALLOC_MODULE);
-}
-
-void *bios_realloc(void *ptr, size_t size)
+__export void *realloc(void *ptr, size_t size)
 {
     struct free_arena_header *ah, *nah;
     struct free_arena_header *head;
@@ -224,7 +201,7 @@ void *bios_realloc(void *ptr, size_t size)
 		    head->next_free = nah;
 		    nah->next_free->prev_free = nah;
 		}
-   	    }
+	    }
 	    /* otherwise, use up the whole block */
 	    return ptr;
 	} else {
@@ -239,19 +216,3 @@ void *bios_realloc(void *ptr, size_t size)
 	}
     }
 }
-
-__export void *realloc(void *ptr, size_t size)
-{
-    return firmware->mem->realloc(ptr, size);
-}
-
-__export void *zalloc(size_t size)
-{
-    void *ptr;
-
-    ptr = malloc(size);
-    if (ptr)
-	memset(ptr, 0, size);
-
-    return ptr;
-}
diff --git a/core/mem/malloc.h b/core/bios/mem/malloc.h
similarity index 100%
rename from core/mem/malloc.h
rename to core/bios/mem/malloc.h
diff --git a/core/mem/tests/Makefile b/core/bios/mem/tests/Makefile
similarity index 100%
rename from core/mem/tests/Makefile
rename to core/bios/mem/tests/Makefile
diff --git a/core/mem/tests/meminit.c b/core/bios/mem/tests/meminit.c
similarity index 100%
rename from core/mem/tests/meminit.c
rename to core/bios/mem/tests/meminit.c
diff --git a/core/common/pmapi.c b/core/common/pmapi.c
deleted file mode 100644
index cfdffa69..00000000
--- a/core/common/pmapi.c
+++ /dev/null
@@ -1,46 +0,0 @@
-/* -----------------------------------------------------------------------
- *
- *   Copyright 1994-2009 H. Peter Anvin - All Rights Reserved
- *   Copyright 2009-2010 Intel Corporation; author: H. Peter Anvin
- *
- *   This program is free software; you can redistribute it and/or modify
- *   it under the terms of the GNU General Public License as published by
- *   the Free Software Foundation, Inc., 53 Temple Place Ste 330,
- *   Boston MA 02111-1307, USA; either version 2 of the License, or
- *   (at your option) any later version; incorporated herein by reference.
- *
- * ----------------------------------------------------------------------- */
-
-#include <inttypes.h>
-#include <com32.h>
-#include <syslinux/pmapi.h>
-#include "core.h"
-#include "fs.h"
-
-const struct com32_pmapi pm_api_vector =
-{
-    .__pmapi_size = sizeof(struct com32_pmapi),
-
-    .lmalloc	= pmapi_lmalloc, /* Allocate low memory */
-    .lfree	= free,		 /* Free low memory */
-
-    .open_file	= open_file,
-    .read_file	= pmapi_read_file,
-    .close_file	= close_file,
-
-    .opendir	= opendir,
-    .readdir	= readdir,
-    .closedir	= closedir,
-
-    .idle	= __idle,
-    .reset_idle	= reset_idle,
-
-    .chdir	= chdir,
-    .getcwd	= core_getcwd,
-
-    .jiffies	= &__jiffies,
-    .ms_timer	= &__ms_timer,
-
-    .sysappend_count	= SYSAPPEND_MAX,
-    .sysappend_strings	= sysappend_strings,
-};
diff --git a/core/common/zalloc.c b/core/common/zalloc.c
new file mode 100644
index 00000000..b3f11448
--- /dev/null
+++ b/core/common/zalloc.c
@@ -0,0 +1,18 @@
+/*
+ * Allocate and zero
+ */
+
+#include <core.h>
+#include <stdlib.h>
+#include <string.h>
+
+__export void *zalloc(size_t size)
+{
+    void *ptr;
+
+    ptr = malloc(size);
+    if (ptr)
+	memset(ptr, 0, size);
+
+    return ptr;
+}
diff --git a/core/efi/i386/linux.S b/core/efi/arch/i386/linux.S
similarity index 100%
rename from core/efi/i386/linux.S
rename to core/efi/arch/i386/linux.S
diff --git a/core/efi/i386/syslinux.ld b/core/efi/arch/i386/syslinux.ld
similarity index 100%
rename from core/efi/i386/syslinux.ld
rename to core/efi/arch/i386/syslinux.ld
diff --git a/core/efi/x86_64/linux.S b/core/efi/arch/x86_64/linux.S
similarity index 100%
rename from core/efi/x86_64/linux.S
rename to core/efi/arch/x86_64/linux.S
diff --git a/core/efi/x86_64/syslinux.ld b/core/efi/arch/x86_64/syslinux.ld
similarity index 100%
rename from core/efi/x86_64/syslinux.ld
rename to core/efi/arch/x86_64/syslinux.ld
diff --git a/core/efi/main.c b/core/efi/main.c
index 74e692c2..8b50a407 100644
--- a/core/efi/main.c
+++ b/core/efi/main.c
@@ -393,9 +393,7 @@ extern uint16_t *bios_free_mem;
 void efi_init(void)
 {
 	/* XXX timer */
-	*bios_free_mem = 0;
 	syslinux_memscan_add(&efi_memscan);
-	mem_init();
 }
 
 char efi_getchar(char *hi)
@@ -1245,12 +1243,6 @@ static void serialcfg(uint16_t *iobase, uint16_t *divisor, uint16_t *flowctl)
 
 extern struct vesa_ops efi_vesa_ops;
 
-struct mem_ops efi_mem_ops = {
-	.malloc = efi_malloc,
-	.realloc = efi_realloc,
-	.free = efi_free,
-};
-
 struct firmware efi_fw = {
 	.init = efi_init,
 	.disk_init = efi_disk_init,
@@ -1260,7 +1252,6 @@ struct firmware efi_fw = {
 	.adv_ops = &efi_adv_ops,
 	.boot_linux = efi_boot_linux,
 	.vesa = &efi_vesa_ops,
-	.mem = &efi_mem_ops,
 };
 
 static inline void syslinux_register_efi(void)
diff --git a/core/efi/mem.c b/core/efi/mem.c
index 67e8221d..6296b856 100644
--- a/core/efi/mem.c
+++ b/core/efi/mem.c
@@ -2,26 +2,38 @@
  * Copyright 2012-2014 Intel Corporation - All Rights Reserved
  */
 
-#include <mem/malloc.h>
+#include <stdlib.h>
+#include <errno.h>
 #include <string.h>
 #include "efi.h"
 
-void *efi_malloc(size_t size, enum heap heap, malloc_tag_t tag)
+__export void *malloc(size_t size)
 {
-	return AllocatePool(size);
+    void *p = AllocatePool(size);
+    if (!p)
+	errno = ENOMEM;
+    return p;
 }
 
-void *efi_realloc(void *ptr, size_t size)
+__export void *lmalloc(size_t) __attribute__((alias("malloc")));
+
+__export void *realloc(void *ptr, size_t size)
 {
 	void *newptr;
 
 	newptr = AllocatePool(size);
-	memcpy(newptr, ptr, size);
-	FreePool(ptr);
+	if (!newptr) {
+	    errno = ENOMEM;
+	    return NULL;
+	}
+	if (ptr) {
+	    memcpy(newptr, ptr, size);
+	    FreePool(ptr);
+	}
 	return newptr;
 }
 
-void efi_free(void *ptr)
+__export void free(void *ptr)
 {
 	FreePool(ptr);
 }


More information about the Syslinux-commits mailing list