From 528f3f8b6b18455926e963bdabd6313b182875ed Mon Sep 17 00:00:00 2001 From: kmeaw Date: Mon, 2 Jul 2012 18:10:07 +0400 Subject: [PATCH 1/3] Initial ARM support --- pd/bq/bq_cont.C | 9 ++++-- pd/bq/bq_cont_supp.S | 68 +++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 71 insertions(+), 6 deletions(-) diff --git a/pd/bq/bq_cont.C b/pd/bq/bq_cont.C index 3d5fbed..dfe3bcf 100644 --- a/pd/bq/bq_cont.C +++ b/pd/bq/bq_cont.C @@ -29,6 +29,12 @@ namespace pd { #define STACK_SIZE (8*1024*1024) #define MISC_REG_NUM (5) +#elif defined(__arm__) + +#define PAGE_SIZE (4096) +#define STACK_SIZE (2*1024*1024) +#define MISC_REG_NUM (8) + #else #error Not implemented yet #endif @@ -65,8 +71,7 @@ unsigned int bq_spec_reserve() throw() { #if \ __gcc_version_current >= __gcc_version(3, 3, 0) && \ - __gcc_version_current < __gcc_version(4, 7, 0) && \ - !defined(__arm__) + __gcc_version_current < __gcc_version(4, 7, 0) struct __cxa_eh_globals { void *caughtExceptions; diff --git a/pd/bq/bq_cont_supp.S b/pd/bq/bq_cont_supp.S index 0d5a165..09dfd46 100644 --- a/pd/bq/bq_cont_supp.S +++ b/pd/bq/bq_cont_supp.S @@ -70,17 +70,77 @@ FUNCTION(_ZN2pd11bq_cont_runEPFvPvES0_S0_) .cfi_endproc movl %esp, %ebp movl 12(%ebp), %eax - movl %eax, %esp + movl %eax, %esp /* __sp = stack; */ movl 8(%ebp), %eax - pushl %eax + pushl %eax /* push(arg); */ movl 4(%ebp), %eax - pushl %eax + pushl %eax /* push(fun); */ xorl %ebp, %ebp - pushl %ebp + pushl %ebp /* push(0); */ jmp _ZN2pd12bq_cont_procEPFvPvES0_ /* pd::bq_cont_proc(fun, arg); */ .cfi_startproc END(_ZN2pd11bq_cont_runEPFvPvES0_S0_) +#elif defined(__arm__) + +#define FUNCTION(fun) \ + .text; \ + .align 2; \ + .p2align 4,,15; \ +.globl fun; \ +fun: \ + .cfi_startproc + +#define END(fun) \ + .cfi_endproc; \ + .size fun, .-fun + +/* +unsigned long pd::state_t::save(); + */ + +FUNCTION(_ZN2pd7state_t4saveEv) + str sp, [r0], #4 /* stack_ptr = __sp; */ + str r9, [r0], #4 /* frame_ptr = __fp; */ + str lr, [r0], #4 /* pc = __lr; */ + stmia r0!, {r4-r11} /* misc = {__r4 .. __r11}; */ + mov r0, #0 /* return (0); */ + mov pc, lr +END(_ZN2pd7state_t4saveEv) + +/* +void __noreturn pd::state_t::restore(int unsigned long x); + */ + +FUNCTION(_ZN2pd7state_t7restoreEm) + ldr sp, [r0], #4 /* __sp = stack_ptr; */ + ldr r9, [r0], #4 /* __fp = frame_ptr; */ + ldr lr, [r0], #4 /* __lr = pc; */ + ldmia r0!, {r4-r11} /* {__r4 .. __r11} = misc; */ + mov r0, r1 /* return (x); */ + mov pc, lr +END(_ZN2pd7state_t7restoreEm) + +/* +extern void __hidden __noreturn pd::bq_cont_proc(void (*fun)(void *), void *arg); + */ + +.hidden _ZN2pd12bq_cont_procEPFvPvES0_ + +/* +void __hidden __noreturn pd::bq_cont_run(void (*fun)(void *), void *arg, void *stack); + */ + +FUNCTION(_ZN2pd11bq_cont_runEPFvPvES0_S0_) + .cfi_endproc + mov sp, r3 /* __sp = stack; */ + movw r3, #:lower16:_ZN2pd12bq_cont_procEPFvPvES0_ + movt r3, #:upper16:_ZN2pd12bq_cont_procEPFvPvES0_ + mov lr, #0 + mov pc, r3 /* pd::bq_cont_proc(fun, arg); */ + .cfi_startproc +END(_ZN2pd11bq_cont_runEPFvPvES0_S0_) + #elif defined(__x86_64__) #define FUNCTION(fun) \ From bbb3659a59f47666b7bd57f29ba3c3db3eee3420 Mon Sep 17 00:00:00 2001 From: kmeaw Date: Wed, 11 Jul 2012 18:20:24 +0400 Subject: [PATCH 2/3] First working ARMv5/ARMv7 version --- opts.mk | 4 ++-- pd/bq/bq_cont.C | 8 +++++--- pd/bq/bq_cont_supp.S | 14 +++++++------- phantom/phantom.C | 4 ++-- test/bq/align.C | 10 ++++++++++ 5 files changed, 26 insertions(+), 14 deletions(-) diff --git a/opts.mk b/opts.mk index 2d7ec29..53903ad 100644 --- a/opts.mk +++ b/opts.mk @@ -36,13 +36,13 @@ DEPS = \ CXXFLAGS = \ -g -O$(OPT) $(CXXSTD) \ -fvisibility=hidden -fvisibility-inlines-hidden -fno-default-inline \ - -fno-omit-frame-pointer -fno-common \ + -fno-omit-frame-pointer -fno-common -fsigned-char \ -Wall -W -Werror -Wsign-promo -Woverloaded-virtual \ -Wno-ctor-dtor-privacy -Wno-non-virtual-dtor $(CPPFLAGS) $(CXXFLAGS.$(<)) CFLAGS = \ -g -O$(OPT) $(CSTD) \ - -fvisibility=hidden -fno-omit-frame-pointer -fno-common \ + -fvisibility=hidden -fno-omit-frame-pointer -fno-common -fsigned-char \ -Wall -W -Werror $(CPPFLAGS) $(CFLAGS.$(<)) diff --git a/pd/bq/bq_cont.C b/pd/bq/bq_cont.C index dfe3bcf..1ff24ef 100644 --- a/pd/bq/bq_cont.C +++ b/pd/bq/bq_cont.C @@ -69,14 +69,16 @@ unsigned int bq_spec_reserve() throw() { return bq_spec_num++; } -#if \ - __gcc_version_current >= __gcc_version(3, 3, 0) && \ - __gcc_version_current < __gcc_version(4, 7, 0) +#if defined(__GXX_ABI_VERSION) && __GXX_ABI_VERSION == 1002 struct __cxa_eh_globals { void *caughtExceptions; unsigned int uncaughtExceptions; +#ifdef __ARM_EABI__ + void *propagatingExceptions; +#endif + inline __cxa_eh_globals() throw() : caughtExceptions(NULL), uncaughtExceptions(0) { } }; diff --git a/pd/bq/bq_cont_supp.S b/pd/bq/bq_cont_supp.S index 09dfd46..2fa8e8d 100644 --- a/pd/bq/bq_cont_supp.S +++ b/pd/bq/bq_cont_supp.S @@ -101,7 +101,7 @@ unsigned long pd::state_t::save(); FUNCTION(_ZN2pd7state_t4saveEv) str sp, [r0], #4 /* stack_ptr = __sp; */ - str r9, [r0], #4 /* frame_ptr = __fp; */ + str r7, [r0], #4 /* frame_ptr = __fp; */ str lr, [r0], #4 /* pc = __lr; */ stmia r0!, {r4-r11} /* misc = {__r4 .. __r11}; */ mov r0, #0 /* return (0); */ @@ -114,11 +114,11 @@ void __noreturn pd::state_t::restore(int unsigned long x); FUNCTION(_ZN2pd7state_t7restoreEm) ldr sp, [r0], #4 /* __sp = stack_ptr; */ - ldr r9, [r0], #4 /* __fp = frame_ptr; */ - ldr lr, [r0], #4 /* __lr = pc; */ + ldr r7, [r0], #4 /* __fp = frame_ptr; */ + ldr r2, [r0], #4 /* __lr = pc; */ ldmia r0!, {r4-r11} /* {__r4 .. __r11} = misc; */ mov r0, r1 /* return (x); */ - mov pc, lr + mov pc, r2 END(_ZN2pd7state_t7restoreEm) /* @@ -133,10 +133,10 @@ void __hidden __noreturn pd::bq_cont_run(void (*fun)(void *), void *arg, void *s FUNCTION(_ZN2pd11bq_cont_runEPFvPvES0_S0_) .cfi_endproc - mov sp, r3 /* __sp = stack; */ - movw r3, #:lower16:_ZN2pd12bq_cont_procEPFvPvES0_ - movt r3, #:upper16:_ZN2pd12bq_cont_procEPFvPvES0_ + mov sp, r2 /* __sp = stack; */ + ldr r3, =_ZN2pd12bq_cont_procEPFvPvES0_ mov lr, #0 + mov r7, #0 mov pc, r3 /* pd::bq_cont_proc(fun, arg); */ .cfi_startproc END(_ZN2pd11bq_cont_runEPFvPvES0_S0_) diff --git a/phantom/phantom.C b/phantom/phantom.C index 244f1e0..ee8618b 100644 --- a/phantom/phantom.C +++ b/phantom/phantom.C @@ -237,8 +237,8 @@ void phantom_t::run(string_t const &conf_name) { if(need_stat) { interval_t period = config.stat.period; if(period > interval_zero) { - unsigned int s = period / interval_second; - unsigned int ms = (period % interval_second) / interval_microsecond; + time_t s = period / interval_second; + suseconds_t ms = (period % interval_second) / interval_microsecond; itimerval it = { { s, ms }, { s, ms } }; setitimer(ITIMER_REAL, &it, NULL); } diff --git a/test/bq/align.C b/test/bq/align.C index 376c979..ceb54a2 100644 --- a/test/bq/align.C +++ b/test/bq/align.C @@ -2,6 +2,8 @@ * compile it with '-O2' to see the effect */ +#if defined(__x86_64__) + #ifndef __OPTIMIZE__ #error not interested without otimisation #endif @@ -56,3 +58,11 @@ extern "C" int main() { return 0; } + +#else + +extern "C" int main() { + return 0; +} + +#endif From 70df33aa2b658aa6f12a02efca58d8d0ca6aafa5 Mon Sep 17 00:00:00 2001 From: kmeaw Date: Tue, 12 Feb 2013 15:13:48 +0400 Subject: [PATCH 3/3] Make latest libbfd happy by defining PACKAGE and PACKAGE_VERSION. --- opts.mk | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/opts.mk b/opts.mk index 53903ad..90c7af8 100644 --- a/opts.mk +++ b/opts.mk @@ -28,7 +28,8 @@ $(eval $(call FIXZERODEPS,$(shell find deps/ -size 0 -printf "%P "))) FIXINC ?= -isystem /usr/include/pd/fixinclude CPPFLAGS = \ - $(FIXINC) -D_GNU_SOURCE=1 $(CPPDEFS) -Wundef + $(FIXINC) -D_GNU_SOURCE=1 -DPACKAGE='"phantom"' \ + -DPACKAGE_VERSION='"$(shell sed -n -e '1s/.*(\(.*\)).*/\1/p' debian/changelog)"' $(CPPDEFS) -Wundef DEPS = \ -MD -MF deps/$(subst /,%,$(@)).d