From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 18813 invoked by alias); 24 May 2002 09:54:53 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 18799 invoked from network); 24 May 2002 09:54:45 -0000 Received: from unknown (HELO sohm.kpit.com) (203.129.230.82) by sources.redhat.com with SMTP; 24 May 2002 09:54:45 -0000 content-class: urn:content-classes:message MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Subject: RE: [PATCH] Add support for scanf, gets in h8300 simulator X-MimeOLE: Produced By Microsoft Exchange V6.0.5762.3 Date: Fri, 24 May 2002 03:07:00 -0000 Message-ID: <69595093233BB547BB70CF5E492B63F22F3FED@sohm.kpit.com> X-MS-Has-Attach: X-MS-TNEF-Correlator: From: "Dhananjay R. Deshpande" To: "Andrew Volkov" Cc: X-SW-Source: 2002-05/txt/msg00899.txt.bz2 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 tra= pa 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 peripher= als. 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, >>=20 >> Resubmitting the patch as per suggestion from Thomas Fitzsimmons.=09 >>=20 > >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 >> * include/opcode/h8300.h: Changed SYSCALL to=20 >SYSCALL_WRITE and added generic SYSCALL for=20 >handling new syscalls. >> * sim/h8300/compile.c: New generic SYSCALL magic trap=20 >JSR @@0xC8=20 >> * sim/h8300/syscall.h: #Define syscall number >>=20 >> For Newlib -=20 >> 2002-05-14 Dhananjay Deshpande >> * newlib/libc/sys/h8300hms/syscalls.c: Moved _read() to read.c >> * newlib/libc/sys/h8300hms/read.c: New file. Magic trap=20 >0xC8 for Simulator >> * newlib/libs/sys/h8300hms/sys/syscall.h: #Define syscall number >> * newlib/libc/sys/h8300hms/Makeile.in: include new file=20 >read.c in lib.a >>=20 >> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D >> *** 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 >> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D >> *** 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" >>=20=20=20 >> #ifndef SIGTRAP >> *************** >> *** 433,437 **** >> dst->cycles =3D q->time; >>=20=20=20 >> ! /* And a jsr to 0xc4 is turned into a magic trap. */ >>=20=20=20 >> if (dst->opcode =3D=3D O (O_JSR, SB)) >> --- 434,438 ---- >> dst->cycles =3D q->time; >>=20=20=20 >> ! /* And a jsr to 0xc4 and 0xc8 is turned into=20 >a magic trap. */ >>=20=20=20 >> if (dst->opcode =3D=3D O (O_JSR, SB)) >> *************** >> *** 439,442 **** >> --- 440,448 ---- >> if (dst->src.literal =3D=3D 0xc4) >> { >> + dst->opcode =3D O (O_SYSCALL_WRITE, SB); >> + } >> + else >> + if (dst->src.literal =3D=3D 0xc8) >> + { >> dst->opcode =3D O (O_SYSCALL, SB); >> } >> *************** >> *** 1265,1272 **** >> goto next; >>=20=20=20 >> ! case O (O_SYSCALL, SB): >> { >> char c =3D cpu.regs[2]; >> sim_callback->write_stdout (sim_callback, &c, 1); >> } >> goto next; >> --- 1271,1301 ---- >> goto next; >>=20=20=20 >> ! case O (O_SYSCALL_WRITE, SB): >> { >> char c =3D cpu.regs[2]; >> sim_callback->write_stdout (sim_callback, &c, 1); >> + } >> + goto next; >> +=20 >> + /* This is generic syscall handler. The syscall # is=20 >passed in r0l */ >> + case O (O_SYSCALL, SB): >> + { >> + unsigned char syscall_number =3D cpu.regs[0] ; >> + switch (syscall_number) >> + { >> + case SYS_read: >> + if (h8300hmode || h8300smode) >> + { >> + cpu.regs[0] =3D sim_callback->read=20 >(sim_callback, cpu.regs[1], (char *) (cpu.regs[2] +=20 >cpu.memory) , cpu.regs[3]); >> + } >> + else >> + { >> + cpu.regs[0] =3D sim_callback->read=20 >(sim_callback, cpu.regs[1], (char *) ((unsigned=20 >short)cpu.regs[2] + cpu.memory) , cpu.regs[3]); >> + } >> + break ; >> +=20 >> + default: >> + break ; >> + } >> } >> goto next; >> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D >> *** 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 */ >> +=20 >> + #define SYS_read 1 >> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D >> *** 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 >>=20=20=20 >> - int _DEFUN(_read,(file, ptr, len), >> - int file _AND >> - char *ptr _AND >> - int len) >> - { >> - return 0; >> - } >> -=20 >>=20=20=20 >> int _DEFUN(_lseek,(file, ptr, dir), >> --- 6,9 ---- >> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D >> *** 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" >> +=20 >> + int _read(file, ptr, len) >> + int file; >> + char *ptr; >> + int len; >> + { >> + register int ret asm("r0") ; >> +=20 >> + /* Type cast int as short so that we can copy int=20 >values into 16 bit=20 >> + registers in case of -mint32 switch is given. >> + This is not going to affect data as file=3D 0 for=20 >stdin and len=3D1024 */ >> +=20 >> + 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; >> + } >> +=20 >> +=20 >> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D >> *** newlib/libc/sys/h8300hms/sys/syscall.h Fri May 17 14:32:29 2002 >> --- newlib/libc/sys/h8300hms/sys/syscall.h.new Fri May=20 >17 11:16:44 2002 >> *************** >> *** 0 **** >> --- 1,2 ---- >> +=20 >> + #define SYS_read 1 >> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D >> *** 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 =3D lib.a >>=20=20=20 >> ! lib_a_SOURCES =3D syscalls.c write.c _exit.c sbrk.c misc.c crt1.c >>=20=20=20 >> ACLOCAL_AMFLAGS =3D -I ../../.. >> --- 85,89 ---- >> noinst_LIBRARIES =3D lib.a >>=20=20=20 >> ! lib_a_SOURCES =3D syscalls.c write.c read.c _exit.c sbrk.c=20 >misc.c crt1.c >>=20=20=20 >> ACLOCAL_AMFLAGS =3D -I ../../.. >> *************** >> *** 99,103 **** >> LIBS =3D @LIBS@ >> lib_a_LIBADD =3D=20 >> ! lib_a_OBJECTS =3D syscalls.o write.o _exit.o sbrk.o misc.o crt1.o >> CFLAGS =3D @CFLAGS@ >> COMPILE =3D $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS)=20 >$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) >> --- 99,103 ---- >> LIBS =3D @LIBS@ >> lib_a_LIBADD =3D=20 >> ! lib_a_OBJECTS =3D syscalls.o write.o read.o _exit.o sbrk.o=20 >misc.o crt1.o >> CFLAGS =3D @CFLAGS@ >> COMPILE =3D $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS)=20 >$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) >> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D >>=20 >> Regards, >> Dhananjay >>=20 >> > Hi, >> >=20 >> > >Syscalls are usually handled a little differently. Have=20 >you considered >> > >keeping the O_SYSCALL macro as is, and passing the=20 >syscall number to the >> > >simulator in a designated register or memory location?=20=20 >Then in the >> > >simulator in compile.c, replace the=20 >sim_callback->write_stdout call with >> > >a switch statement that calls the appropriate=20 >sim_callback based on the >> > >contents of the "syscall" register. >> >=20 >> > I had implemented it in the same way earlier but passing=20 >syscall number as parameter makes simulator incompatible with=20 >previous builds of toolchain. This is because the current=20 >implementation of _write syscall is not passing syscall number=20 >as parameter. Any suggestion about this?=20 >> >=20 >>=20 >> >This change would only make previous versions of newlib=20 >(and binaries >> >linked with them) incompatible with the new simulator. So=20 >people with >> >old binaries can either use an older simulator, or=20 >recompile newlib and >> >relink their programs. Either way, IMO it's not too much to ask in >> >return for new syscalls. >>=20 >> >Alternatively, you could keep your O_SYSCALL_WRITE, and change your >> >O_SYSCALL_READ to O_SYSCALL_GENERIC. Then all new syscalls=20 >would use >> >the generic method, and old binaries would keep working. >>=20 >> >Tom >>=20 >> >--=20 >> >Thomas Fitzsimmons >> >Red Hat Canada Limited e-mail: fitzsim@redhat.com >> >2323 Yonge Street, Suite 300 >> >Toronto, ON M4P2C9