From cbeddaa621d586a26bbfe57c27a5412e29c5d352 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20Fr=C3=B6schle?= Date: Tue, 17 Feb 2015 11:12:29 +0000 Subject: [PATCH] added libgcc_helper.S to retarget libgcc calls for 64 bit multiplication/division --- BaS_gcc/BaS_gcc.files | 1 + BaS_gcc/Makefile | 8 +++++--- BaS_gcc/bas.lk.in | 4 ++-- BaS_gcc/util/libgcc_helper.S | 26 ++++++++++++++++++++++++++ BaS_gcc/x86emu/x86emu.c | 3 +++ 5 files changed, 37 insertions(+), 5 deletions(-) create mode 100644 BaS_gcc/util/libgcc_helper.S diff --git a/BaS_gcc/BaS_gcc.files b/BaS_gcc/BaS_gcc.files index cc1783c..83305e4 100644 --- a/BaS_gcc/BaS_gcc.files +++ b/BaS_gcc/BaS_gcc.files @@ -201,3 +201,4 @@ Makefile x86emu/x86biosemu.c x86emu/x86emu.c x86emu/x86pcibios.c +util/libgcc_helper.S diff --git a/BaS_gcc/Makefile b/BaS_gcc/Makefile index d3ff0c3..25033cc 100644 --- a/BaS_gcc/Makefile +++ b/BaS_gcc/Makefile @@ -29,6 +29,7 @@ AR=$(TCPREFIX)ar RANLIB=$(TCPREFIX)ranlib NATIVECC=gcc +LDLIBS=-L/usr/lib/gcc/m68k-elf/4.9.2/m5475 -lgcc INCLUDE=-Iinclude CFLAGS=-mcpu=5474 \ -g \ @@ -140,6 +141,7 @@ CSRCS= \ ASRCS= \ startcf.S \ printf_helper.S \ + libgcc_helper.S \ exceptions.S \ xhdi_vec.S \ pci_wrappers.S @@ -255,7 +257,7 @@ define EX_TEMPLATE $(1)_MAPFILE=$(1)/$$(basename $$(FLASH_EXEC)).map $(1)/$$(FLASH_EXEC): $(1)/$(LIBBAS) $(LDCSRC) $(CPP) $(INCLUDE) -DOBJDIR=$(1)/objs -P -DFORMAT_ELF=$(FORMAT_ELF) -D$$(MACHINE) $(LDCSRC) -o $(1)/$$(LDCFILE) - $(LD) --oformat $$(FORMAT) -Map $$($(1)_MAPFILE) --cref -T $(1)/$$(LDCFILE) -o $$@ + $(LD) --oformat $$(FORMAT) -Map $$($(1)_MAPFILE) --cref -T $(1)/$$(LDCFILE) $(LDLIBS) -o $$@ ifeq ($(COMPILE_ELF),Y) $(OBJCOPY) -O srec $$@ $$(basename $$@).s19 else @@ -266,7 +268,7 @@ endif $(1)_MAPFILE_RAM=$(1)/$$(basename $$(RAM_EXEC)).map $(1)/$$(RAM_EXEC): $(1)/$(LIBBAS) $(LDCSRC) $(CPP) $(INCLUDE) -DCOMPILE_RAM -DOBJDIR=$(1)/objs -P -DFORMAT_ELF=$(FORMAT_ELF) -D$$(MACHINE) $(LDCSRC) -o $(1)/$$(LDRFILE) - $(LD) $(LDFLAGS) --oformat $$(FORMAT) -Map $$($(1)_MAPFILE_RAM) --cref -T $(1)/$$(LDRFILE) -o $$@ + $(LD) $(LDFLAGS) --oformat $$(FORMAT) -Map $$($(1)_MAPFILE_RAM) --cref -T $(1)/$$(LDRFILE) $(LDLIBS) -o $$@ ifeq ($(COMPILE_ELF),Y) $(OBJCOPY) -O srec $$@ $$(basename $$@).s19 else @@ -277,7 +279,7 @@ endif $(1)_MAPFILE_BFL=$(1)/$$(basename $$(BASFLASH_EXEC)).map $(1)/$$(BASFLASH_EXEC): $(1)/objs/basflash.o $(1)/objs/basflash_start.o $(1)/$(LIBBAS) $(LDCBFL) $(CPP) $(INCLUDE) -P -DOBJDIR=$(1)/objs -DFORMAT_ELF=$(FORMAT_ELF) -D$$(MACHINE) $(LDCBSRC) -o $(1)/$$(LDCBFS) - $(LD) --oformat $$(FORMAT) -Map $$($(1)_MAPFILE_BFL) --cref -T $(1)/$$(LDCFILE) -L$(1) -lbas -o $$@ + $(LD) --oformat $$(FORMAT) -Map $$($(1)_MAPFILE_BFL) --cref -T $(1)/$$(LDCFILE) -L$(1) -lbas $(LDLIBS) -o $$@ ifeq ($(COMPILE_ELF),Y) $(OBJCOPY) -O srec $$@ $$(basename $$@).s19 else diff --git a/BaS_gcc/bas.lk.in b/BaS_gcc/bas.lk.in index 0ac26a7..42c5467 100644 --- a/BaS_gcc/bas.lk.in +++ b/BaS_gcc/bas.lk.in @@ -79,6 +79,7 @@ SECTIONS OBJDIR/s19reader.o(.text) OBJDIR/bas_printf.o(.text) OBJDIR/bas_string.o(.text) + OBJDIR/libgcc_helper.o(.text) OBJDIR/printf_helper.o(.text) OBJDIR/cache.o(.text) OBJDIR/dma.o(.text) @@ -118,6 +119,7 @@ SECTIONS #endif /* COMPILE_RAM */ #if (FORMAT_ELF == 1) + *(.eh_frame) *(.rodata) *(.rodata.*) #endif @@ -154,8 +156,6 @@ SECTIONS * Global memory map */ - ___muldi3 = __muldi3; - /* SDRAM Initialization */ ___SDRAM = SDRAM_START; ___SDRAM_SIZE = SDRAM_SIZE; diff --git a/BaS_gcc/util/libgcc_helper.S b/BaS_gcc/util/libgcc_helper.S new file mode 100644 index 0000000..c67d48a --- /dev/null +++ b/BaS_gcc/util/libgcc_helper.S @@ -0,0 +1,26 @@ +/* + * needed for ELF compilation of x86emu which uses 64 bit multiplication and division. This + * is implemented in libgcc.a. However, the ELF compiler emits leading underscores and libgcc + * is not compiled like that - we must reimplement the symbols. + * + * FIXME: This is a quirk and should be replaced by BaS' own implementation later + */ + .global ___divdi3 + .extern __divdi3 +___divdi3: jmp __divdi3 + + .global ___muldi3 + .extern __muldi3 +___muldi3: jmp __muldi3 + + .global ___moddi3 + .extern __moddi3 +___moddi3: jmp __moddi3 + + .global ___udivdi3 + .extern __udivdi3 +___udivdi3: jmp __udivdi3 + + .global ___umoddi3 + .extern __umoddi3 +___umoddi3: jmp __umoddi3 diff --git a/BaS_gcc/x86emu/x86emu.c b/BaS_gcc/x86emu/x86emu.c index a157b75..740fc90 100644 --- a/BaS_gcc/x86emu/x86emu.c +++ b/BaS_gcc/x86emu/x86emu.c @@ -169,6 +169,7 @@ static void push_long (struct X86EMU *, uint32_t w); static uint16_t pop_word (struct X86EMU *); static uint32_t pop_long (struct X86EMU *); + /**************************************************************************** REMARKS: Handles any pending asychronous interrupts. @@ -7819,6 +7820,8 @@ idiv_word(struct X86EMU *emu, uint16_t s) emu->x86.R_AX = (uint16_t) div; emu->x86.R_DX = (uint16_t) mod; } + + /**************************************************************************** REMARKS: Implements the IDIV instruction and side effects.