public inbox for gdb@sourceware.org
 help / color / mirror / Atom feed
From: Mike Frysinger <vapier@gentoo.org>
To: Joel Sherrill <joel@rtems.org>,
	Eli Zaretskii via Gdb <gdb@sourceware.org>,
	Newlib <newlib@sourceware.org>
Subject: Re: Microblaze libgloss and gdb simulator
Date: Sat, 24 Apr 2021 01:02:18 -0400	[thread overview]
Message-ID: <YIOmWgu87/SobzBI@vapier> (raw)
In-Reply-To: <YIIgtg74ojIQcFDC@vapier>

On 22 Apr 2021 21:19, Mike Frysinger via Gdb wrote:
> On 22 Apr 2021 19:55, Joel Sherrill wrote:
> > On Thu, Apr 22, 2021, 7:27 PM Mike Frysinger wrote:
> > > ignoring that, the microblaze sim doesn't have syscall support hooked up.
> > > so it's only a CPU simulator atm.
> > 
> > So it has no output whatsoever? Does it get used for anything?
> 
> afaict, correct.  the most basic sims just do CPU level stuff and then have
> their state inspected, or communicate pass/fail via exit status or abort.
> this behavior actually isn't that rare ... it's where most sims start.
> 
> > We are resurrecting some old work that I did for a Microblaze port. I did
> > write an inbyte() and outbyte() which would normally come from the xil
> > library. But I don't have any idea how I figured out there was a uart at a
> > particular address. I swear I had it working to print then but now it
> > faults after the first instruction.
> > 
> > Is there any known good executable for it? Even just seeing it operate with
> > a linked executable that had a crt0 and did something would be helpful at
> > this point.
> 
> ftr, i've never worked on microblaze.  i'm just reading the code and poking
> the toolchain :).
> 
> getting i/o (or maybe just o) support into the sim shouldn't be terribly hard.
> we could even do the normal libgloss syscalls.  the important things we need to
> know are:
> * how does outbyte work ?  is it writing to MMIO UARTs, or something else ?
> * is there an interrupt or exception or specific insn that microblaze uses to
>   trigger the hypervisor/monitor/whatever ?  if so, should be possible to wire
>   that up in the microblaze port.  my reading of libgloss/microblaze/ isn't
>   picking out anything interesting, but i'm by no means an expert here.
> 
> if you can figure out those bits, happy to help on the sim side.

here's wiring up the syscall path, but it's unclear whether we should do this
without changes landing in libgloss first.
-mike

--- a/sim/common/gennltvals.py
+++ b/sim/common/gennltvals.py
@@ -66,6 +66,7 @@ TARGETS = {
     'm32c',
     'm32r',
     'mcore',
+    'microblaze',
     'mn10200',
     'mn10300',
     'moxie',
--- a/sim/common/nltvals.def
+++ b/sim/common/nltvals.def
@@ -484,6 +484,37 @@
 /* end mcore sys target macros */
 #endif
 #endif
+#ifdef NL_TARGET_microblaze
+#ifdef sys_defs
+/* from syscall.h */
+/* begin microblaze sys target macros */
+ { "SYS_argc", 22 },
+ { "SYS_argn", 24 },
+ { "SYS_argnlen", 23 },
+ { "SYS_argv", 13 },
+ { "SYS_argvlen", 12 },
+ { "SYS_chdir", 14 },
+ { "SYS_chmod", 16 },
+ { "SYS_close", 3 },
+ { "SYS_exit", 1 },
+ { "SYS_fstat", 10 },
+ { "SYS_getpid", 8 },
+ { "SYS_gettimeofday", 19 },
+ { "SYS_kill", 9 },
+ { "SYS_link", 21 },
+ { "SYS_lseek", 6 },
+ { "SYS_open", 2 },
+ { "SYS_read", 4 },
+ { "SYS_reconfig", 25 },
+ { "SYS_stat", 15 },
+ { "SYS_time", 18 },
+ { "SYS_times", 20 },
+ { "SYS_unlink", 7 },
+ { "SYS_utime", 17 },
+ { "SYS_write", 5 },
+/* end microblaze sys target macros */
+#endif
+#endif
 #ifdef NL_TARGET_mn10200
 #ifdef sys_defs
 /* from syscall.h */
--- a/sim/microblaze/Makefile.in
+++ b/sim/microblaze/Makefile.in
@@ -15,6 +15,9 @@
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
+# This selects the bfin newlib/libgloss syscall definitions.
+NL_TARGET = -DNL_TARGET_microblaze
+
 ## COMMON_PRE_CONFIG_FRAG
 
 SIM_OBJS = \
diff --git a/sim/microblaze/interp.c b/sim/microblaze/interp.c
index 2bd067c6dc51..ed29d020efbc 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"
 
@@ -162,11 +163,14 @@ sim_engine_run (SIM_DESC sd,
       delay_slot_enable = 0;
       branch_taken = 0;
       if (op == microblaze_brk)
-	sim_engine_halt (sd, NULL, NULL, NULL_CIA, sim_stopped, SIM_SIGTRAP);
+	{
+	  sim_engine_halt (sd, NULL, NULL, NULL_CIA, sim_stopped, SIM_SIGTRAP);
+	}
       else if (inst == MICROBLAZE_HALT_INST)
 	{
 	  insts += 1;
 	  bonus_cycles++;
+	  TRACE_INSN (cpu, "HALT (%i)", RETREG);
 	  sim_engine_halt (sd, NULL, NULL, NULL_CIA, sim_exited, RETREG);
 	}
       else
@@ -175,6 +179,7 @@ sim_engine_run (SIM_DESC sd,
 	    {
 #define INSTRUCTION(NAME, OPCODE, TYPE, ACTION)		\
 	    case NAME:					\
+	      TRACE_INSN (cpu, #NAME);			\
 	      ACTION;					\
 	      break;
 #include "microblaze.isa"
@@ -284,8 +289,18 @@ sim_engine_run (SIM_DESC sd,
 		    IMM_ENABLE = 0;
 	        }
 	      else
-		/* no delay slot: increment cycle count */
-		bonus_cycles++;
+		{
+		  if (op == brki)
+		    {
+		      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++;
+		}
 	    }
 	}
 
--- a/sim/microblaze/microblaze.isa
+++ b/sim/microblaze/microblaze.isa
@@ -110,6 +110,7 @@ INSTRUCTION(addi,
 	    INST_TYPE_RD_RA_IMM,
             CARRY = C_calc(RA, IMM, 0);
 	    RD = RA + IMM;
+	    TRACE_REGISTER (cpu, "r%i = r%i + %i", rd, ra, IMM);
 	    C_wr(CARRY);
 	    PC += INST_SIZE)
 
--- 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"
 
--- 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

  reply	other threads:[~2021-04-24  5:02 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-04-22 22:25 Joel Sherrill
     [not found] ` <CAF9ehCV8fPNObXbTALFFpfnOX53ZbKen-EdtNWWrsQNYekxnSQ@mail.gmail.com>
2021-04-23  0:27   ` Mike Frysinger
2021-04-23  0:55     ` Joel Sherrill
2021-04-23  1:19       ` Mike Frysinger
2021-04-24  5:02         ` Mike Frysinger [this message]
2021-04-25 17:21           ` Mike Frysinger
2021-04-25 18:37             ` Michael Eager
2021-04-25 20:27               ` Mike Frysinger
2021-04-25 22:29                 ` Michael Eager
2021-04-25 23:34                   ` Mike Frysinger
2021-04-26  0:44                     ` Michael Eager

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=YIOmWgu87/SobzBI@vapier \
    --to=vapier@gentoo.org \
    --cc=gdb@sourceware.org \
    --cc=joel@rtems.org \
    --cc=newlib@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).