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: "Dhananjay R. Deshpande" <dhananjayd at kpit dot com>
- To: "Thomas Fitzsimmons" <fitzsim at redhat dot com>
- Cc: <newlib at sources dot redhat dot com>
- Date: Thu, 16 May 2002 11:14:16 +0530
- Subject: RE: [PATCH] Add support for scanf, gets in h8300 simulator
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?
>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.
Yes, I would also like syscalls to be handled in this way. I had referred syscalls handling in SH target and implemented in similar way but had to change due to reason as explained above.
>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.
That's my mistake.
Dhananjay
>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