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: "Andrew Volkov" <Andrew dot Volkov at transas dot com>
- Cc: <gdb-patches at sources dot redhat dot com>
- Date: Fri, 24 May 2002 15:23:38 +0530
- Subject: RE: [PATCH] Add support for scanf, gets in h8300 simulator
Hi,
>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.
There is a trapa instruction available in H8300/H and H8/S but not in H8300. With current implementation, it will be same for all. If we implement trapa for H8300/H and H8300/S, still we will have to support the H8300/L with current implementation. Since nothing is actually written at 0xc4 and 0xc8, it should not be a problem for code running on target using those peripherals. Users can put there vector handler at those vectors.
Dhananjay
>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