This is the mail archive of the gdb-patches@sources.redhat.com mailing list for the GDB 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


Hi,

Resubmitting the patch as per suggestion from Thomas Fitzsimmons.	

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


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