From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 25119 invoked by alias); 18 May 2002 08:36:54 -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 25106 invoked from network); 18 May 2002 08:36:51 -0000 Received: from unknown (HELO harvester.transas.com) (193.125.200.2) by sources.redhat.com with SMTP; 18 May 2002 08:36:51 -0000 Received: from localhost (localhost [127.0.0.1]) by harvester.transas.com (Postfix) with SMTP id E853E6B829; Sat, 18 May 2002 12:36:49 +0400 (MSD) Received: from clue.transas.com (clue.transas.com [10.0.0.42]) by harvester.transas.com (Postfix) with ESMTP id 2BA4E6B81F; Sat, 18 May 2002 12:36:49 +0400 (MSD) Received: by clue.transas.com with Internet Mail Service (5.5.2653.19) id ; Sat, 18 May 2002 12:36:49 +0400 Message-ID: <2E74F312D6980D459F3A05492BA40F8DDD756E@clue.transas.com> From: Andrew Volkov To: newlib@sources.redhat.com, gdb-patches@sources.redhat.com Subject: RE: [PATCH] Add support for scanf, gets in h8300 simulator Date: Sat, 18 May 2002 01:36:00 -0000 MIME-Version: 1.0 Content-Type: text/plain; charset="koi8-r" X-SW-Source: 2002-05/txt/msg00776.txt.bz2 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. 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 >> * 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 >> * 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 >> >> - 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 >