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


Hi,

Maybe now is time to change ugly "magic" 0xc4 vector to something more
correct 
(ex. trap  for h8s)? Because on many h8h/h8s chips, vectors 0xc4 and 0xc8
are busy under peripheries.

Andrey Volkov



>-----Original Message-----
>From: Thomas Fitzsimmons [mailto:fitzsim@redhat.com]
>Sent: Friday, May 17, 2002 11:55 PM
>To: Dhananjay R. Deshpande
>Cc: newlib@sources.redhat.com; gdb-patches@sources.redhat.com
>Subject: 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]