This is the mail archive of the newlib@sources.redhat.com mailing list for the newlib project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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


On Tue, 2002-05-14 at 04:52, Dhananjay R. Deshpande wrote:
> Hi,
> 
> This patch to gdb and newlib adds support for reading from STDIN in h8300 simulator. Currently functions like scanf and gets are not working with h8300 simulator, this patch shall provide that functionality.
> 

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.

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.

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.

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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]