sim: microblaze: hook up libgloss syscalls

Message ID 20210427033111.24745-1-vapier@gentoo.org
State New
Headers show
Series
  • sim: microblaze: hook up libgloss syscalls
Related show

Commit Message

Mike Frysinger via Gdb-patches April 27, 2021, 3:31 a.m.
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).
---
 sim/microblaze/interp.c                | 15 +++++++++++++--
 sim/testsuite/microblaze/fail.s        |  9 +++++++++
 sim/testsuite/microblaze/pass.s        |  1 -
 sim/testsuite/microblaze/testutils.inc | 20 +++++++++++++++++++-
 4 files changed, 41 insertions(+), 4 deletions(-)
 create mode 100644 sim/testsuite/microblaze/fail.s

-- 
2.30.2

Patch

diff --git a/sim/microblaze/interp.c b/sim/microblaze/interp.c
index 2bd067c6dc51..129291895d1c 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/fail.s b/sim/testsuite/microblaze/fail.s
new file mode 100644
index 000000000000..f9bbe3c311c6
--- /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 93ed92474f8b..36179745c86a 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 158a3c5e7836..f222be9dccdc 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