diff options
author | Mike Frysinger <vapier@gentoo.org> | 2021-04-26 23:14:11 -0400 |
---|---|---|
committer | Mike Frysinger <vapier@gentoo.org> | 2021-05-04 21:47:10 -0400 |
commit | cd09ab7c7463d05fe27e3dab4f97bb8aa6570413 (patch) | |
tree | 3e957d821a94ec5ddddcacd8e36c6a9479f38e65 /sim | |
parent | 13ffdac36f589830863b10c760b79ab7809e1b12 (diff) | |
download | gdb-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/ChangeLog | 5 | ||||
-rw-r--r-- | sim/microblaze/interp.c | 15 | ||||
-rw-r--r-- | sim/testsuite/microblaze/ChangeLog | 8 | ||||
-rw-r--r-- | sim/testsuite/microblaze/fail.s | 9 | ||||
-rw-r--r-- | sim/testsuite/microblaze/pass.s | 1 | ||||
-rw-r--r-- | sim/testsuite/microblaze/testutils.inc | 20 |
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 |