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