diff options
Diffstat (limited to 'runtime/loc2c-runtime.h')
-rw-r--r-- | runtime/loc2c-runtime.h | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/runtime/loc2c-runtime.h b/runtime/loc2c-runtime.h index 9c84f6df..df180949 100644 --- a/runtime/loc2c-runtime.h +++ b/runtime/loc2c-runtime.h @@ -112,6 +112,13 @@ #define fetch_register(regno) ((intptr_t) c->regs->gpr[regno]) #define store_register(regno) (c->regs->gpr[regno] = (value)) +#elif defined (__arm__) + +#undef fetch_register +#undef store_register +#define fetch_register(regno) ((long) c->regs->uregs[regno]) +#define store_register(regno) (c->regs->uregs[regno] = (value)) + #elif defined (__s390__) || defined (__s390x__) #undef fetch_register #undef store_register @@ -294,6 +301,37 @@ goto deref_fault; \ }) +#elif defined (__arm__) + +#define deref(size, addr) \ + ({ \ + int _bad = 0; \ + intptr_t _v=0; \ + switch (size){ \ + case 1: __get_user_asm_byte(_v, addr, _bad); break; \ + case 2: __get_user_asm_half(_v, addr, _bad); break; \ + case 4: __get_user_asm_word(_v, addr, _bad); break; \ + default: __get_user_bad(); break; \ + } \ + if (_bad) \ + goto deref_fault; \ + _v; \ + }) + +#define store_deref(size, addr, value) \ + ({ \ + int _bad=0; \ + switch (size){ \ + case 1: __put_user_asm_byte(value, addr, _bad); break; \ + case 2: __put_user_asm_half(value, addr, _bad); break; \ + case 4: __put_user_asm_word(value, addr, _bad); break; \ + case 8: __put_user_asm_dword(value, addr, _bad); break; \ + default: __put_user_bad(); break; \ + } \ + if (_bad) \ + goto deref_fault; \ + }) + #elif defined (__s390__) || defined (__s390x__) #ifndef EX_TABLE |