aboutsummaryrefslogtreecommitdiff
path: root/sim
diff options
context:
space:
mode:
authorMike Frysinger <vapier@gentoo.org>2021-04-26 23:14:11 -0400
committerMike Frysinger <vapier@gentoo.org>2021-05-04 21:47:10 -0400
commitcd09ab7c7463d05fe27e3dab4f97bb8aa6570413 (patch)
tree3e957d821a94ec5ddddcacd8e36c6a9479f38e65 /sim
parent13ffdac36f589830863b10c760b79ab7809e1b12 (diff)
downloadgdb-cd09ab7c7463d05fe27e3dab4f97bb8aa6570413.zip
gdb-cd09ab7c7463d05fe27e3dab4f97bb8aa6570413.tar.gz
gdb-cd09ab7c7463d05fe27e3dab4f97bb8aa6570413.tar.bz2
sim: microblaze: hook up libgloss syscalls
When in the virtual environment, have brki 8 trigger libgloss syscalls like other ports. This also matches the ABI that Linux uses for its syscalls (ignoring the syscall table differences).
Diffstat (limited to 'sim')
-rw-r--r--sim/microblaze/ChangeLog5
-rw-r--r--sim/microblaze/interp.c15
-rw-r--r--sim/testsuite/microblaze/ChangeLog8
-rw-r--r--sim/testsuite/microblaze/fail.s9
-rw-r--r--sim/testsuite/microblaze/pass.s1
-rw-r--r--sim/testsuite/microblaze/testutils.inc20
6 files changed, 54 insertions, 4 deletions
diff --git a/sim/microblaze/ChangeLog b/sim/microblaze/ChangeLog
index 510cdde..8300491 100644
--- a/sim/microblaze/ChangeLog
+++ b/sim/microblaze/ChangeLog
@@ -1,5 +1,10 @@
2021-05-04 Mike Frysinger <vapier@gentoo.org>
+ * interp.c: Include sim-syscall.h.
+ (sim_engine_run): Call sim_syscall for brki instructions.
+
+2021-05-04 Mike Frysinger <vapier@gentoo.org>
+
* configure: Regenerate.
2021-05-01 Mike Frysinger <vapier@gentoo.org>
diff --git a/sim/microblaze/interp.c b/sim/microblaze/interp.c
index 2bd067c..1292918 100644
--- a/sim/microblaze/interp.c
+++ b/sim/microblaze/interp.c
@@ -28,6 +28,7 @@
#include "sim-main.h"
#include "sim-options.h"
+#include "sim-syscall.h"
#include "microblaze-dis.h"
@@ -284,8 +285,18 @@ sim_engine_run (SIM_DESC sd,
IMM_ENABLE = 0;
}
else
- /* no delay slot: increment cycle count */
- bonus_cycles++;
+ {
+ if (op == brki && IMM == 8)
+ {
+ RETREG = sim_syscall (cpu, CPU.regs[12], CPU.regs[5],
+ CPU.regs[6], CPU.regs[7],
+ CPU.regs[8]);
+ PC = RD + INST_SIZE;
+ }
+
+ /* no delay slot: increment cycle count */
+ bonus_cycles++;
+ }
}
}
diff --git a/sim/testsuite/microblaze/ChangeLog b/sim/testsuite/microblaze/ChangeLog
index b282fc3..205646e 100644
--- a/sim/testsuite/microblaze/ChangeLog
+++ b/sim/testsuite/microblaze/ChangeLog
@@ -1,3 +1,11 @@
+2021-05-04 Mike Frysinger <vapier@gentoo.org>
+
+ * pass.s: Delete output line.
+ * testutils.inc (system_call, write): New macros.
+ (exit): Mark nr required.
+ (pass, fail): Call write
+ * fail.s: New test.
+
2021-04-08 Mike Frysinger <vapier@gentoo.org>
* allinsn.exp (arch): Delete.
diff --git a/sim/testsuite/microblaze/fail.s b/sim/testsuite/microblaze/fail.s
new file mode 100644
index 0000000..f9bbe3c
--- /dev/null
+++ b/sim/testsuite/microblaze/fail.s
@@ -0,0 +1,9 @@
+# check that the sim doesn't die immediately.
+# mach: microblaze
+# status: 1
+# output: fail\n
+
+.include "testutils.inc"
+
+ start
+ fail
diff --git a/sim/testsuite/microblaze/pass.s b/sim/testsuite/microblaze/pass.s
index 93ed924..3617974 100644
--- a/sim/testsuite/microblaze/pass.s
+++ b/sim/testsuite/microblaze/pass.s
@@ -1,6 +1,5 @@
# check that the sim doesn't die immediately.
# mach: microblaze
-# output:
.include "testutils.inc"
diff --git a/sim/testsuite/microblaze/testutils.inc b/sim/testsuite/microblaze/testutils.inc
index 158a3c5..f222be9 100644
--- a/sim/testsuite/microblaze/testutils.inc
+++ b/sim/testsuite/microblaze/testutils.inc
@@ -1,5 +1,12 @@
+# MACRO: system_call
+# Make a libgloss/Linux system call
+ .macro system_call nr:req
+ addi r12, r0, \nr;
+ brki r14, 8;
+ .endm
+
# MACRO: exit
- .macro exit nr
+ .macro exit nr:req
addi r3, r0, \nr;
bri 0;
.endm
@@ -7,6 +14,7 @@
# MACRO: pass
# Write 'pass' to stdout and quit
.macro pass
+ write 1, 1f, 5
exit 0
.data
1: .asciz "pass\n"
@@ -15,6 +23,7 @@
# MACRO: fail
# Write 'fail' to stdout and quit
.macro fail
+ write 1, 1f, 5
exit 1
.data
1: .asciz "fail\n"
@@ -27,3 +36,12 @@
.global _start
_start:
.endm
+
+# MACRO: write
+# Just like the write() C function; uses system calls
+ .macro write fd:req, buf:req, count:req
+ addi r5, r0, \fd;
+ addi r6, r0, \buf;
+ addi r7, r0, \count;
+ system_call 5
+ .endm