[PATCH] Add support for scanf, gets in h8300 simulator

Dhananjay R. Deshpande dhananjayd@kpit.com
Wed May 15 22:43:00 GMT 2002


Hi,

>Syscalls are usually handled a little differently.  Have you considered
>keeping the O_SYSCALL macro as is, and passing the syscall number to the
>simulator in a designated register or memory location?  Then in the
>simulator in compile.c, replace the sim_callback->write_stdout call with
>a switch statement that calls the appropriate sim_callback based on the
>contents of the "syscall" register.

I had implemented it in the same way earlier but passing syscall number as parameter makes simulator incompatible with previous builds of toolchain. This is because the current implementation of _write syscall is not passing syscall number as parameter. Any suggestion about this? 

>Handling syscalls in that way has several advantages.  You can add new
>syscalls more easily, you can use standard syscall numbers, and the
>simulator logic is simpler.

 Yes, I would also like syscalls to be handled in this way. I had referred syscalls handling in SH target and implemented in similar way but had to change due to reason as explained above.

>If you wanted to, you could even generalize your _read function into a
>macro that could be re-used to define any syscall (see
>src/libgloss/i386/cygmon-syscall.h for examples).  Then adding support
>for a new syscall would be as simple as adding a macro call to
>syscalls.c in newlib, and a sim_callback call to compile.c in the
>simulator.

>One other minor thing: your patch to newlib/libc/sys/h8300hms/syscalls.c
>removes errno.h, but the _unlink function needs it.

That's my mistake. 

Dhananjay

>Tom


> For Simulator -
> 2002-05-14 Dhananjay Deshpande <dhananjayd@kpit.com>
> 	* include/opcode/h8300.h: Add #define for SYSCALL_READ
> 	* sim/h8300/compile.c: Convert magic trap 0xC8 into SYSCALL_READ
> 
> For Newlib - 
> 2002-05-14 Dhananjay Deshpande <dhananjayd@kpit.com>
> 	* newlib/libc/sys/h8300hms/syscalls.c: Moved _read() to read.c
> 	* newlib/libc/sys/h8300hms/read.c: New file. Magic trap 0xC8 for Simulator
> 	* newlib/libc/sys/h8300hms/Makeile.in: include new file read.c in lib.a
> 
> ===================================================================
> *** include/opcode/h8300.h	Tue May 14 11:25:29 2002
> --- include/opcode/h8300.h.new	Tue May 14 11:25:19 2002
> ***************
> *** 296,300 ****
>   #define O_ILL 76
>   #define O_ADDS 77
> ! #define O_SYSCALL 78
>   #define O_MOV_TO_REG 79
>   #define O_TAS 80
> --- 296,300 ----
>   #define O_ILL 76
>   #define O_ADDS 77
> ! #define O_SYSCALL_WRITE 78
>   #define O_MOV_TO_REG 79
>   #define O_TAS 80
> ***************
> *** 305,309 ****
>   #define O_STM 86
>   #define O_STMAC 87
> ! #define O_LAST 88
>   #define SB 0
>   #define SW 1
> --- 305,310 ----
>   #define O_STM 86
>   #define O_STMAC 87
> ! #define O_SYSCALL_READ 88
> ! #define O_LAST 89
>   #define SB 0
>   #define SW 1
> 
> ===================================================================
> *** sim/h8300/compile.c	Tue May 14 11:19:24 2002
> --- sim/h8300/compile.c.new	Tue May 14 11:19:19 2002
> ***************
> *** 433,437 ****
>   		  dst->cycles = q->time;
>   
> ! 		  /* And a jsr to 0xc4 is turned into a magic trap.  */
>   
>   		  if (dst->opcode == O (O_JSR, SB))
> --- 433,437 ----
>   		  dst->cycles = q->time;
>   
> ! 		  /* And a jsr to 0xc4 and 0xc8 is turned into a magic trap.  */
>   
>   		  if (dst->opcode == O (O_JSR, SB))
> ***************
> *** 439,443 ****
>   		      if (dst->src.literal == 0xc4)
>   			{
> ! 			  dst->opcode = O (O_SYSCALL, SB);
>   			}
>   		    }
> --- 439,448 ----
>   		      if (dst->src.literal == 0xc4)
>   			{
> ! 			  dst->opcode = O (O_SYSCALL_WRITE, SB);
> ! 			}
> ! 		      else
> ! 		      if (dst->src.literal == 0xc8)
> ! 			{
> ! 			  dst->opcode = O (O_SYSCALL_READ, SB);
>   			}
>   		    }
> ***************
> *** 1267,1274 ****
>   	  goto next;
>   
> ! 	case O (O_SYSCALL, SB):
>   	  {
>   	    char c = cpu.regs[2];
>   	    sim_callback->write_stdout (sim_callback, &c, 1);
>   	  }
>   	  goto next;
> --- 1272,1292 ----
>   	  goto next;
>   
> ! 	case O (O_SYSCALL_WRITE, SB):
>   	  {
>   	    char c = cpu.regs[2];
>   	    sim_callback->write_stdout (sim_callback, &c, 1);
> + 	  }
> + 	  goto next;
> + 
> + 	case O (O_SYSCALL_READ, SB):
> + 	  {
> + 	    if (h8300hmode)
> + 	    {
> + 	    	cpu.regs[0] = sim_callback->read (sim_callback, cpu.regs[1], (char *) (cpu.regs[2] + cpu.memory) , cpu.regs[3]);
> + 	    }
> + 	    else
> + 	    {
> + 	    	cpu.regs[0] = sim_callback->read (sim_callback, cpu.regs[1], (char *) ((unsigned short)cpu.regs[2] + cpu.memory) , cpu.regs[3]);
> + 	    }
>   	  }
>   	  goto next;
> 
> ===================================================================
> *** newlib/libc/sys/h8300hms/syscalls.c	Fri May 10 12:20:53 2002
> --- newlib/libc/sys/h8300hms/syscalls.c.new	Tue May 14 10:49:33 2002
> ***************
> *** 4,16 ****
>   #include <sys/types.h>
>   #include <sys/stat.h>
> - #include <errno.h>
> - 
> - int _DEFUN(_read,(file, ptr, len),
> - 	   int file _AND
> - 	   char *ptr _AND
> - 	   int len)
> - {
> -   return 0;
> - }
>   
>   
> --- 4,7 ----
> 
> ===================================================================
> *** newlib/libc/sys/h8300hms/read.c	Tue May 14 10:50:53 2002
> --- newlib/libc/sys/h8300hms/read.c.new	Tue May 14 10:52:34 2002
> ***************
> *** 0 ****
> --- 1,25 ----
> + 
> + int _read(file, ptr, len)
> +      int file;
> +      char *ptr;
> +      int len;
> + {
> + 	register int ret asm("r0") ;
> + 
> + 	// Type cast int as short so that we can copy values into 16 bit 
> + 	// registers in case of -mint32 switch is given.
> + 	// This is not going to affect data as file = 0 for stdin and len=1024 
> + 
> + 	asm("mov.w %0, r1" :: "r"((short)file) :"r1", "r2", "r3") ;
> + 	asm("mov.w %0, r3" :: "r"((short)len) :"r1", "r2", "r3") ;
> + #ifdef __H8300__
> + 	asm("mov.w %0, r2" :: "r"(ptr) :"r1", "r2", "r3") ;
> + #else
> + 	asm("mov.l %0, er2" :: "r"(ptr) :"r1", "er2", "r3") ;
> + #endif
> + 	// This is magic trap similar to _write for simulator
> + 	asm("jsr @@0xc8") ;
> +   return ret;
> + }
> + 
> + 
> 
> ===================================================================
> *** newlib/libc/sys/h8300hms/Makefile.in	Fri May 10 12:20:53 2002
> --- newlib/libc/sys/h8300hms/Makefile.in.new	Tue May 14 10:54:46 2002
> ***************
> *** 85,89 ****
>   noinst_LIBRARIES = lib.a
>   
> ! lib_a_SOURCES = syscalls.c write.c _exit.c sbrk.c misc.c crt1.c
>   
>   ACLOCAL_AMFLAGS = -I ../../..
> --- 85,89 ----
>   noinst_LIBRARIES = lib.a
>   
> ! lib_a_SOURCES = syscalls.c write.c read.c _exit.c sbrk.c misc.c crt1.c
>   
>   ACLOCAL_AMFLAGS = -I ../../..
> ***************
> *** 99,103 ****
>   LIBS = @LIBS@
>   lib_a_LIBADD = 
> ! lib_a_OBJECTS =  syscalls.o write.o _exit.o sbrk.o misc.o crt1.o
>   CFLAGS = @CFLAGS@
>   COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
> --- 99,103 ----
>   LIBS = @LIBS@
>   lib_a_LIBADD = 
> ! lib_a_OBJECTS =  syscalls.o write.o read.o _exit.o sbrk.o misc.o crt1.o
>   CFLAGS = @CFLAGS@
>   COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
> ===================================================================
> 
> Regards,
> Dhananjay
> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> Free download of GNUSH and GNUH8 tool chains for Hitachi's SH and H8 Series.
> The following site also offers free support to European customers.
> Read more at http://www.kpit.com/products/support.htm
> Latest versions of GNUSH and GNUH8 are released on Apr 1, 2002.
> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
-- 
Thomas Fitzsimmons
Red Hat Canada Limited        e-mail: fitzsim@redhat.com
2323 Yonge Street, Suite 300
Toronto, ON M4P2C9



More information about the Newlib mailing list