From fbb4841606b555311048229cf26de22ea5cf0682 Mon Sep 17 00:00:00 2001 From: Thomas Preud'homme Date: Thu, 28 Feb 2013 16:55:10 +0100 Subject: [PATCH] Add __clear_cache implementation in libtcc1 Add __clear_cache function for flushing caches to libtcc1. --- Makefile | 3 ++- lib/Makefile | 11 +++++++++++ lib/libtcc1.c | 24 +++++++++++++++++++++++- 3 files changed, 36 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 4a273644..ce151e1d 100644 --- a/Makefile +++ b/Makefile @@ -66,7 +66,7 @@ NATIVE_DEFINES_$(CONFIG_i386) += -DTCC_TARGET_I386 NATIVE_DEFINES_$(CONFIG_x86-64) += -DTCC_TARGET_X86_64 NATIVE_DEFINES_$(CONFIG_WIN32) += -DTCC_TARGET_PE NATIVE_DEFINES_$(CONFIG_uClibc) += -DTCC_UCLIBC -NATIVE_DEFINES_$(CONFIG_arm) += -DTCC_TARGET_ARM -DWITHOUT_LIBTCC +NATIVE_DEFINES_$(CONFIG_arm) += -DTCC_TARGET_ARM NATIVE_DEFINES_$(CONFIG_arm_eabihf) += -DTCC_ARM_EABI -DTCC_ARM_HARDFLOAT NATIVE_DEFINES_$(CONFIG_arm_eabi) += -DTCC_ARM_EABI NATIVE_DEFINES_$(CONFIG_arm_vfp) += -DTCC_ARM_VFP @@ -122,6 +122,7 @@ LIBTCC1=libtcc1.a else ifeq ($(ARCH),arm) NATIVE_FILES=$(ARM_FILES) PROGS_CROSS=$(I386_CROSS) $(X64_CROSS) $(WIN32_CROSS) $(WIN64_CROSS) $(C67_CROSS) +LIBTCC1=libtcc1.a endif ifeq ($(TARGETOS),Darwin) diff --git a/lib/Makefile b/lib/Makefile index 300fa46f..dfd01c3d 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -24,6 +24,10 @@ ifndef TARGET ifneq ($(TARGETOS),Darwin) XCC = $(CC) endif + else + ifeq ($(ARCH),arm) + TARGET = arm + endif endif endif endif @@ -41,6 +45,7 @@ cross : TCC = $(TOP)/$(TARGET)-tcc$(EXESUF) I386_O = libtcc1.o alloca86.o alloca86-bt.o $(BCHECK_O) X86_64_O = libtcc1.o alloca86_64.o +ARM_O = libtcc1.o WIN32_O = $(I386_O) crt1.o wincrt1.o dllcrt1.o dllmain.o chkstk.o WIN64_O = $(X86_64_O) crt1.o wincrt1.o dllcrt1.o dllmain.o chkstk.o @@ -65,12 +70,18 @@ ifeq "$(TARGET)" "x86_64" OBJ = $(addprefix $(DIR)/,$(X86_64_O)) TGT = -DTCC_TARGET_X86_64 XCC ?= $(TCC) -B$(TOP) +else +ifeq "$(TARGET)" "arm" + OBJ = $(addprefix $(DIR)/,$(ARM_O)) + TGT = -DTCC_TARGET_ARM + XCC ?= $(TCC) -B$(TOP) else $(error libtcc1.a not supported on target '$(TARGET)') endif endif endif endif +endif XFLAGS = $(CPPFLAGS) $(CFLAGS) $(TGT) diff --git a/lib/libtcc1.c b/lib/libtcc1.c index a717701b..31036915 100644 --- a/lib/libtcc1.c +++ b/lib/libtcc1.c @@ -107,7 +107,7 @@ union float_long { }; /* XXX: we don't support several builtin supports for now */ -#ifndef __x86_64__ +#if !defined(__x86_64__) && !defined(__arm__) /* XXX: use gcc/tcc intrinsic ? */ #if defined(__i386__) @@ -713,6 +713,28 @@ void __clear_cache(char *beginning, char *end) { } +#elif defined(__arm__) + +#define _GNU_SOURCE +#include +#include + +void __clear_cache(char *beginning, char *end) +{ +/* __ARM_NR_cacheflush is kernel private and should not be used in user space. + * However, there is no ARM asm parser in tcc so we use it for now */ +#if 1 + syscall(__ARM_NR_cacheflush); +#else + __asm__ ("push {r7}\n\t" + "mov r7, #0xf0002\n\t" + "mov r2, #0\n\t" + "swi 0\n\t" + "pop {r7}\n\t" + "ret"); +#endif +} + #else #warning __clear_cache not defined for this architecture, avoid using tcc -run #endif