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 Fri, 2002-05-17 at 08:47, Dhananjay R. Deshpande wrote:
> Hi,
> 
> Resubmitting the patch as per suggestion from Thomas Fitzsimmons.	
> 

I'm going to change SYS_read to match the value found in
libgloss/syscall.h (4), before committing this.

Tom

> For Simulator -
> 2002-05-14 Dhananjay Deshpande <dhananjayd@kpit.com>
> 	* include/opcode/h8300.h: Changed SYSCALL to SYSCALL_WRITE and added generic 		  SYSCALL for handling new syscalls.
> 	* sim/h8300/compile.c: New generic SYSCALL magic trap JSR @@0xC8 
> 	* sim/h8300/syscall.h: #Define syscall number
> 
> 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/libs/sys/h8300hms/sys/syscall.h: #Define syscall number
> 	* newlib/libc/sys/h8300hms/Makeile.in: include new file read.c in lib.a
> 
> ===================================================================
> *** include/opcode/h8300.h	Fri May 17 14:46:05 2002
> --- include/opcode/h8300.h.new	Fri May 17 11:48:48 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 88
> ! #define O_LAST 89
>   #define SB 0
>   #define SW 1
> ===================================================================
> *** sim/h8300/compile.c	Fri May 17 14:45:22 2002
> --- sim/h8300/compile.c.new	Fri May 17 11:46:55 2002
> ***************
> *** 35,38 ****
> --- 35,39 ----
>   #include "callback.h"
>   #include "remote-sim.h"
> + #include "syscall.h"
>   
>   #ifndef SIGTRAP
> ***************
> *** 433,437 ****
>   		  dst->cycles = q->time;
>   
> ! 		  /* And a jsr to 0xc4 is turned into a magic trap.  */
>   
>   		  if (dst->opcode == O (O_JSR, SB))
> --- 434,438 ----
>   		  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,442 ****
> --- 440,448 ----
>   		      if (dst->src.literal == 0xc4)
>   			{
> + 			  dst->opcode = O (O_SYSCALL_WRITE, SB);
> + 			}
> + 		      else
> + 		      if (dst->src.literal == 0xc8)
> + 			{
>   			  dst->opcode = O (O_SYSCALL, SB);
>   			}
> ***************
> *** 1265,1272 ****
>   	  goto next;
>   
> ! 	case O (O_SYSCALL, SB):
>   	  {
>   	    char c = cpu.regs[2];
>   	    sim_callback->write_stdout (sim_callback, &c, 1);
>   	  }
>   	  goto next;
> --- 1271,1301 ----
>   	  goto next;
>   
> ! 	case O (O_SYSCALL_WRITE, SB):
>   	  {
>   	    char c = cpu.regs[2];
>   	    sim_callback->write_stdout (sim_callback, &c, 1);
> + 	  }
> + 	  goto next;
> + 
> + 	/* This is generic syscall handler. The syscall # is passed in r0l */
> + 	case O (O_SYSCALL, SB):
> + 	  {
> + 	    unsigned char syscall_number = cpu.regs[0] ;
> + 	    switch (syscall_number)
> + 	    {
> + 		case SYS_read:
> + 		    if (h8300hmode || h8300smode)
> + 		    {
> + 			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]);
> + 		    }
> + 		    break ;
> + 
> + 		default:
> + 		    break ;
> + 	    }
>   	  }
>   	  goto next;
> ===================================================================
> *** sim/h8300/syscall.h	Fri May 17 14:44:54 2002
> --- sim/h8300/syscall.h.new	Fri May 17 11:31:18 2002
> ***************
> *** 0 ****
> --- 1,3 ----
> + /* This is copied from newlib */
> + 
> + #define	SYS_read	1
> ===================================================================
> *** newlib/libc/sys/h8300hms/syscalls.c	Fri May 17 14:53:56 2002
> --- newlib/libc/sys/h8300hms/syscalls.c.new	Thu May 16 10:05:42 2002
> ***************
> *** 6,17 ****
>   #include <errno.h>
>   
> - int _DEFUN(_read,(file, ptr, len),
> - 	   int file _AND
> - 	   char *ptr _AND
> - 	   int len)
> - {
> -   return 0;
> - }
> - 
>   
>   int _DEFUN(_lseek,(file, ptr, dir),
> --- 6,9 ----
> ===================================================================
> *** newlib/libc/sys/h8300hms/read.c	Fri May 17 14:32:40 2002
> --- newlib/libc/sys/h8300hms/read.c.new	Fri May 17 14:32:00 2002
> ***************
> *** 0 ****
> --- 1,27 ----
> + #include "sys/syscall.h"
> + 
> + 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 int 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.b %0, r0l"::  "i" (SYS_read)) ; /* Syscall Number */
> + 	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/sys/syscall.h	Fri May 17 14:32:29 2002
> --- newlib/libc/sys/h8300hms/sys/syscall.h.new	Fri May 17 11:16:44 2002
> ***************
> *** 0 ****
> --- 1,2 ----
> + 
> + #define	SYS_read	1
> ===================================================================
> *** newlib/libc/sys/h8300hms/Makefile.in	Fri May 17 14:54:06 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
> 
> > 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? 
> > 
> 
> >This change would only make previous versions of newlib (and binaries
> >linked with them) incompatible with the new simulator.  So people with
> >old binaries can either use an older simulator, or recompile newlib and
> >relink their programs.  Either way, IMO it's not too much to ask in
> >return for new syscalls.
> 
> >Alternatively, you could keep your O_SYSCALL_WRITE, and change your
> >O_SYSCALL_READ to O_SYSCALL_GENERIC.  Then all new syscalls would use
> >the generic method, and old binaries would keep working.
> 
> >Tom
> 
> >-- 
> >Thomas Fitzsimmons
> >Red Hat Canada Limited        e-mail: fitzsim@redhat.com
> >2323 Yonge Street, Suite 300
> >Toronto, ON M4P2C9
-- 
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]