This is the mail archive of the
newlib@sources.redhat.com
mailing list for the newlib project.
RE: [PATCH] Add support for scanf, gets in h8300 simulator
- From: Thomas Fitzsimmons <fitzsim at redhat dot com>
- To: "Dhananjay R. Deshpande" <dhananjayd at kpit dot com>
- Cc: newlib at sources dot redhat dot com, gdb-patches at sources dot redhat dot com
- Date: 17 May 2002 15:54:58 -0400
- Subject: RE: [PATCH] Add support for scanf, gets in h8300 simulator
- References: <69595093233BB547BB70CF5E492B63F22F3246@sohm.kpit.com>
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