summaryrefslogtreecommitdiffstats
path: root/runtime/loc2c-runtime.h
diff options
context:
space:
mode:
Diffstat (limited to 'runtime/loc2c-runtime.h')
-rw-r--r--runtime/loc2c-runtime.h38
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