This is the mail archive of the
systemtap@sourceware.org
mailing list for the systemtap project.
[RFC 01/13] mips: Minimal build support
- From: Crestez Dan Leonard <cdleonard at gmail dot com>
- To: systemtap at sourceware dot org
- Date: Thu, 31 Jul 2014 23:21:06 +0300
- Subject: [RFC 01/13] mips: Minimal build support
- Authentication-results: sourceware.org; auth=none
- References: <cover dot 1406837921 dot git dot cdleonard at gmail dot com>
- References: <cover dot 1406837921 dot git dot cdleonard at gmail dot com>
Signed-off-by: Crestez Dan Leonard <cdleonard@gmail.com>
---
runtime/linux/copy.c | 2 +-
runtime/linux/loc2c-runtime.h | 36 ++++++++++++++++++++++++++++++++++++
runtime/loc2c-runtime.h | 9 +++++++++
runtime/regs.h | 4 ++++
tapsets.cxx | 1 +
5 files changed, 51 insertions(+), 1 deletion(-)
diff --git a/runtime/linux/copy.c b/runtime/linux/copy.c
index 4e802b6..c870990 100644
--- a/runtime/linux/copy.c
+++ b/runtime/linux/copy.c
@@ -84,7 +84,7 @@ do { \
: "i"(-EFAULT), "0"(count), "1"(count), "3"(src), "4"(dst) \
: "memory"); \
} while (0)
-#elif defined (__powerpc__) || defined (__arm__)
+#elif defined (__powerpc__) || defined (__arm__) || defined(__mips__)
#define __stp_strncpy_from_user(dst,src,count,res) \
do { res = __strncpy_from_user(dst, src, count); } while(0)
diff --git a/runtime/linux/loc2c-runtime.h b/runtime/linux/loc2c-runtime.h
index a3bec58..dd1b002 100644
--- a/runtime/linux/loc2c-runtime.h
+++ b/runtime/linux/loc2c-runtime.h
@@ -575,6 +575,42 @@ extern void __store_deref_bad(void);
STORE_DEREF_FAULT(addr); \
})
+#elif defined __mips__
+
+#define _stp_deref(size, addr, seg) \
+ ({ \
+ int _bad = 0; \
+ intptr_t _v = 0; \
+ mm_segment_t _oldfs = get_fs(); \
+ set_fs(seg); \
+ pagefault_disable(); \
+ if (lookup_bad_addr((unsigned long)addr, size)) \
+ _bad = 1; \
+ else \
+ _bad = 1; \
+ pagefault_enable(); \
+ set_fs(_oldfs); \
+ if (_bad) \
+ DEREF_FAULT(addr); \
+ _v; \
+ })
+
+#define _stp_store_deref(size, addr, value, seg) \
+ ({ \
+ int _bad = 0; \
+ mm_segment_t _oldfs = get_fs(); \
+ set_fs(seg); \
+ pagefault_disable(); \
+ if (lookup_bad_addr((unsigned long)addr, size)) \
+ _bad = 1; \
+ else \
+ _bad = 1; \
+ pagefault_enable(); \
+ set_fs(_oldfs); \
+ if (_bad) \
+ STORE_DEREF_FAULT(addr); \
+ })
+
#elif defined (__aarch64__)
#define _stp_deref(size, addr, seg) \
diff --git a/runtime/loc2c-runtime.h b/runtime/loc2c-runtime.h
index bd13341..fe5a5c7 100644
--- a/runtime/loc2c-runtime.h
+++ b/runtime/loc2c-runtime.h
@@ -154,6 +154,15 @@
#define pt_regs_store_register(pt_regs,regno,value) \
(pt_regs->gpr[regno] = (value))
+#elif defined __mips__
+
+#undef pt_regs_fetch_register
+#undef pt_regs_store_register
+#define pt_regs_fetch_register(pt_regs,regno) \
+ ((intptr_t) pt_regs->regs[regno])
+#define pt_regs_store_register(pt_regs,regno,value) \
+ (pt_regs->regs[regno] = (value))
+
#elif defined (__aarch64__)
#undef pt_regs_fetch_register
diff --git a/runtime/regs.h b/runtime/regs.h
index 2f027ad..94680af 100644
--- a/runtime/regs.h
+++ b/runtime/regs.h
@@ -54,6 +54,10 @@
#define REG_SP(regs) regs->ARM_sp
#define REG_LINK(regs) regs->ARM_lr
+#elif defined (__mips__)
+#define REG_IP(regs_arg) ((regs_arg)->cp0_epc)
+#define REG_SP(regs_arg) ((regs_arg)->regs[29])
+
#elif defined (__s390__) || defined (__s390x__)
#ifndef __s390x__
diff --git a/tapsets.cxx b/tapsets.cxx
index 6604c27..3724a96 100644
--- a/tapsets.cxx
+++ b/tapsets.cxx
@@ -2294,6 +2294,7 @@ validate_module_elf (Dwfl_Module *mod, const char *name, base_query *q)
case EM_IA_64: expect_machine = "ia64"; break;
case EM_ARM: expect_machine = "arm*"; break;
case EM_AARCH64: expect_machine = "arm64"; break;
+ case EM_MIPS: expect_machine = "mips"; break;
// XXX: fill in some more of these
default: expect_machine = "?"; break;
}