[PATCH] MicroBlaze support by Edgar E. Iglesias
monstr at monstr.eu
monstr at monstr.eu
Mon Aug 24 12:59:58 UTC 2009
From: Edgar E. Iglesias <edgar.iglesias at gmail.com>
* configure.ac: Make it recognize microblaze.
* process.c (change_syscall, set_arg): Add support for microblaze.
* signal.c (sys_sigreturn): Add support for microblaze.
* syscall.c (get_scno): Add support for microblaze.
(syscall_fixup): Add support for microblaze.
(get_error): Add support for microblaze.
(syscall_enter): Add support for microblaze.
* util.c (printcall): Add support for microblaze.
Signed-off-by: Edgar E. Iglesias <edgar.iglesias at gmail.com>
Signed-off-by: Michal Simek <monstr at monstr.eu>
---
configure.ac | 4 +++
process.c | 80 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
signal.c | 27 +++++++++++++++++++
syscall.c | 35 +++++++++++++++++++++++++
util.c | 8 ++++++
5 files changed, 153 insertions(+), 1 deletions(-)
diff --git a/configure.ac b/configure.ac
index 3b1db7c..1e69c68 100644
--- a/configure.ac
+++ b/configure.ac
@@ -71,6 +71,10 @@ mips*)
arch=mips
AC_DEFINE([MIPS], 1, [Define for the MIPS architecture.])
;;
+microblaze*)
+ arch=microblaze
+ AC_DEFINE([MICROBLAZE], 1, [Define for the MicroBlaze architecture.])
+ ;;
alpha*)
arch=alpha
AC_DEFINE([ALPHA], 1, [Define for the Alpha architecture.])
diff --git a/process.c b/process.c
index 45ba33b..bf83f7e 100644
--- a/process.c
+++ b/process.c
@@ -141,6 +141,39 @@
#define WCOREDUMP(status) ((status) & 0200)
#endif
+#if defined(MICROBLAZE)
+/* FIXME: Let the kernel export a user-struct. */
+#if 0
+#ifndef HAVE_STRUCT_USER
+struct user
+{
+ struct pt_regs regs;
+};
+#endif
+#endif
+
+#ifndef PT_GPR
+#define PT_GPR(x) (x * 4)
+#endif
+#ifndef NUM_GPRS
+#define NUM_GPRS 32
+#endif
+
+#ifndef PT_PC
+#define PT_PC ((NUM_GPRS + 0) * 4)
+#endif
+#ifndef PT_MSR
+#define PT_MSR ((NUM_GPRS + 1) * 4)
+#endif
+#ifndef PT_EAR
+#define PT_EAR ((NUM_GPRS + 2) * 4)
+#define PT_ESR ((NUM_GPRS + 3) * 4)
+#define PT_FSR ((NUM_GPRS + 4) * 4)
+#define PT_KERNEL_MODE ((NUM_GPRS + 5) * 4)
+#define PT_SINGLESTEP ((NUM_GPRS + 6) * 4)
+#endif
+#endif
+
/* WTA: this was `&& !defined(LINUXSPARC)', this seems unneeded though? */
#if defined(HAVE_PRCTL)
static const struct xlat prctl_options[] = {
@@ -737,6 +770,10 @@ change_syscall(struct tcb *tcp, int new)
if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_V0), new)<0)
return -1;
return 0;
+#elif defined(MICROBLAZE)
+ if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_GPR(0)), new)<0)
+ return -1;
+ return 0;
#elif defined(ALPHA)
if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_A3), new)<0)
return -1;
@@ -3124,6 +3161,47 @@ const struct xlat struct_user_offsets[] = {
{ 69, "fpcsr" },
{ 70, "fpeir" },
# endif
+# ifdef MICROBLAZE
+ { PT_GPR(0), "r0" },
+ { PT_GPR(1), "r1" },
+ { PT_GPR(2), "r2" },
+ { PT_GPR(3), "r3" },
+ { PT_GPR(4), "r4" },
+ { PT_GPR(5), "r5" },
+ { PT_GPR(6), "r6" },
+ { PT_GPR(7), "r7" },
+ { PT_GPR(8), "r8" },
+ { PT_GPR(9), "r9" },
+ { PT_GPR(10), "r10" },
+ { PT_GPR(11), "r11" },
+ { PT_GPR(12), "r12" },
+ { PT_GPR(13), "r13" },
+ { PT_GPR(14), "r14" },
+ { PT_GPR(15), "r15" },
+ { PT_GPR(16), "r16" },
+ { PT_GPR(17), "r17" },
+ { PT_GPR(18), "r18" },
+ { PT_GPR(19), "r19" },
+ { PT_GPR(20), "r20" },
+ { PT_GPR(21), "r21" },
+ { PT_GPR(22), "r22" },
+ { PT_GPR(23), "r23" },
+ { PT_GPR(24), "r24" },
+ { PT_GPR(25), "r25" },
+ { PT_GPR(26), "r26" },
+ { PT_GPR(27), "r27" },
+ { PT_GPR(28), "r28" },
+ { PT_GPR(29), "r29" },
+ { PT_GPR(30), "r30" },
+ { PT_GPR(31), "r31" },
+ { PT_PC, "rpc", },
+ { PT_MSR, "rmsr", },
+ { PT_EAR, "rear", },
+ { PT_ESR, "resr", },
+ { PT_FSR, "rfsr", },
+ { PT_KERNEL_MODE, "kernel_mode", },
+ { PT_SINGLESTEP, "singlestep", },
+# endif
# ifdef CRISV10
{ 4*PT_FRAMETYPE, "4*PT_FRAMETYPE" },
{ 4*PT_ORIG_R10, "4*PT_ORIG_R10" },
@@ -3196,7 +3274,7 @@ const struct xlat struct_user_offsets[] = {
# if !defined(SPARC) && !defined(HPPA) && !defined(POWERPC) \
&& !defined(ALPHA) && !defined(IA64) \
- && !defined(CRISV10) && !defined(CRISV32)
+ && !defined(CRISV10) && !defined(CRISV32) && !defined(MICROBLAZE)
# if !defined(S390) && !defined(S390X) && !defined(MIPS) && !defined(SPARC64) && !defined(AVR32) && !defined(BFIN)
{ uoff(u_fpvalid), "offsetof(struct user, u_fpvalid)" },
# endif
diff --git a/signal.c b/signal.c
index 76504f6..e21ef28 100644
--- a/signal.c
+++ b/signal.c
@@ -1477,6 +1477,33 @@ sys_sigreturn(struct tcb *tcp)
return RVAL_NONE | RVAL_STR;
}
return 0;
+#elif defined(MICROBLAZE)
+ struct sigcontext sc;
+
+ /* TODO: Verify that this is correct... */
+ if (entering(tcp)) {
+ long sp;
+
+ tcp->u_arg[0] = 0;
+
+ /* Read r1, the stack pointer. */
+ if (upeek(tcp, 1 * 4, &sp) < 0)
+ return 0;
+ if (umove(tcp, sp, &sc) < 0)
+ return 0;
+ tcp->u_arg[0] = 1;
+ tcp->u_arg[1] = sc.oldmask;
+ } else {
+ sigset_t sigm;
+ long_to_sigset(tcp->u_arg[1], &sigm);
+ tcp->u_rval = tcp->u_error = 0;
+
+ if (tcp->u_arg[0] == 0)
+ return 0;
+ tcp->auxstr = sprintsigmask("mask now ", &sigm, 0);
+ return RVAL_NONE | RVAL_STR;
+ }
+ return 0;
#elif defined(CRISV10) || defined(CRISV32)
struct sigcontext sc;
diff --git a/syscall.c b/syscall.c
index 26b1a9d..55400b7 100644
--- a/syscall.c
+++ b/syscall.c
@@ -775,6 +775,8 @@ internal_syscall(struct tcb *tcp)
static long r9;
#elif defined(X86_64)
static long rax;
+#elif defined(MICROBLAZE)
+ static long r3;
#elif defined(CRISV10) || defined(CRISV32)
static long r10;
#endif
@@ -1296,6 +1298,9 @@ get_scno(struct tcb *tcp)
return 0;
}
}
+# elif defined(MICROBLAZE)
+ if (upeek(tcp, 0, &scno) < 0)
+ return -1;
# elif defined(CRISV10) || defined(CRISV32)
if (upeek(tcp, 4*PT_R9, &scno) < 0)
return -1;
@@ -1503,6 +1508,14 @@ syscall_fixup(struct tcb *tcp)
fprintf(stderr, "stray syscall exit: r8 = %ld\n", r8);
return 0;
}
+#elif defined(MICROBLAZE)
+ if (upeek(tcp, 3 * 4, &r3) < 0)
+ return -1;
+ if (r3 != -ENOSYS && !(tcp->flags & TCB_INSYSCALL)) {
+ if (debug)
+ fprintf(stderr, "stray syscall exit: r3 = %ld\n", r3);
+ return 0;
+ }
#elif defined(CRISV10) || defined(CRISV32)
if (upeek(tcp->pid, 4*PT_R10, &r10) < 0)
return -1;
@@ -1695,6 +1708,16 @@ get_error(struct tcb *tcp)
tcp->u_rval = r9;
u_error = 0;
}
+# elif defined(MICROBLAZE)
+ /* interpret result as return value or error number */
+ if (is_negated_errno(r3)) {
+ tcp->u_rval = -1;
+ u_error = -r3;
+ }
+ else {
+ tcp->u_rval = r3;
+ u_error = 0;
+ }
# elif defined(CRISV10) || defined(CRISV32)
if (r10 && (unsigned) -r10 < nerrnos) {
tcp->u_rval = -1;
@@ -2214,6 +2237,18 @@ syscall_enter(struct tcb *tcp)
return -1;
}
}
+#elif defined(MICROBLAZE)
+ {
+ int i;
+ if (tcp->scno >= 0 && tcp->scno < nsyscalls)
+ tcp->u_nargs = sysent[tcp->scno].nargs;
+ else
+ tcp->u_nargs = 0;
+ for (i = 0; i < tcp->u_nargs; i++) {
+ if (upeek(tcp, (5 + i) * 4, &tcp->u_arg[i]) < 0)
+ return -1;
+ }
+ }
#elif defined(CRISV10) || defined(CRISV32)
{
int i;
diff --git a/util.c b/util.c
index f41b0c3..95cdde4 100644
--- a/util.c
+++ b/util.c
@@ -1319,6 +1319,14 @@ printcall(struct tcb *tcp)
return;
}
tprintf("[%08lx] ", pc);
+# elif defined(MICROBLAZE)
+ long pc;
+
+ if (upeek(tcp, PT_PC, &pc) < 0) {
+ tprintf ("[????????] ");
+ return;
+ }
+ tprintf("[%08lx] ", pc);
# elif defined(SH)
long pc;
--
1.5.5.1
More information about the Strace-devel
mailing list