[prev in list] [next in list] [prev in thread] [next in thread]
List: gdb
Subject: RE: PATCH : H8300 Simulator File I/O Implementation
From: "D.Venkatasubramanian, Noida" <dvenkat () noida ! hcltech ! com>
Date: 2002-11-30 5:38:49
Message-ID: E04CF3F88ACBD5119EFE00508BBB212105D59B4C () exch-01 ! noida ! hcltech ! com
[Download RAW message or body]
Hi All,
>
>I haven't looked at the patch carefully, but I think it would be nice
>you could send your patch as an attachment as some lines are folded.
I am attaching the patch file.
>
>Could you fix the indentation? The standard indentation is 2 spaces
>for each levela like
Fixed.
>
>Kazu Hirata
>
Regards,
Venky
Thu Nov 28 14:49:51 IST 2002 D.Venkatasubramanian
(dvenkat@noida.hcltech.com)
* compile.c (decode): Added code for some more magic traps.
* compile.c (sim_resume): Added support for File I/O system
calls through callback to host_system.
System calls provided support for :
open, read, write, lseek, close, stat, fstat
Only basic support for stat and fstat.
Thu Nov 28 14:58:41 IST 2002 D.Venkatasubramanian
<dvenkat@noida.hcltech.com>
*h8300.h: Added some more pseudo opcodes for system call processing.
Thu Nov 28 15:02:51 IST 2002 D.Venkatasubramanian
<dvenkat@noida.hcltech.com>
* /libc/sys/h8300hms/syscalls.c: Support for various File I/O
related system calls. Jump to magic vector locations, instead
of dummy return values.
* /libc/sys/h8300hms/read.c: Jump to magic vector location for
supporting read system call.
* /libc/sys/h8300hms/write.c: Jump to magic vector location for
supporting write system call.
["ChangeLog.txt" (text/plain)]
Thu Nov 28 14:49:51 IST 2002 D.Venkatasubramanian (dvenkat@noida.hcltech.com)
* compile.c (decode): Added code for some more magic traps.
* compile.c (sim_resume): Added support for File I/O system
calls through callback to host_system.
System calls provided support for :
open, read, write, lseek, close, stat, fstat
Only basic support for stat and fstat.
Thu Nov 28 14:58:41 IST 2002 D.Venkatasubramanian <dvenkat@noida.hcltech.com>
*h8300.h: Added some more pseudo opcodes for system call processing.
Thu Nov 28 15:02:51 IST 2002 D.Venkatasubramanian <dvenkat@noida.hcltech.com>
* /libc/sys/h8300hms/syscalls.c: Support for various File I/O
related system calls. Jump to magic vector locations, instead
of dummy return values.
* /libc/sys/h8300hms/read.c: Jump to magic vector location for
supporting read system call.
* /libc/sys/h8300hms/write.c: Jump to magic vector location for
supporting write system call.
["patch.txt" (text/plain)]
*** sim/h8300/compile.c.original Thu Nov 14 17:36:40 2002
--- sim/h8300/compile.c.modified Sat Nov 30 10:37:42 2002
***************
*** 35,40 ****
--- 35,42 ----
#include "gdb/callback.h"
#include "gdb/remote-sim.h"
#include "gdb/sim-h8300.h"
+ #include "sys/stat.h"
+ #include "sys/types.h"
#ifndef SIGTRAP
# define SIGTRAP 5
*************** decode (addr, data, dst)
*** 448,461 ****
dst->opcode = q->how;
dst->cycles = q->time;
! /* And a jsr to 0xc4 is turned into a magic trap. */
!
if (dst->opcode == O (O_JSR, SB))
{
! if (dst->src.literal == 0xc4)
! {
! dst->opcode = O (O_SYSCALL, SB);
! }
}
dst->next_pc = addr + len / 2;
--- 450,487 ----
dst->opcode = q->how;
dst->cycles = q->time;
! /* And a jsr to these locations are turned into magic traps. */
if (dst->opcode == O (O_JSR, SB))
{
! if (dst->src.literal == 0xc5)
! {
! dst->opcode = O (O_SYS_OPEN, SB);
! }
! else if (dst->src.literal == 0xc6)
! {
! dst->opcode = O (O_SYS_READ, SB);
! }
! else if (dst->src.literal == 0xc7)
! {
! dst->opcode = O (O_SYS_WRITE, SB);
! }
! else if (dst->src.literal == 0xc8)
! {
! dst->opcode = O (O_SYS_LSEEK, SB);
! }
! else if (dst->src.literal == 0xc9)
! {
! dst->opcode = O (O_SYS_CLOSE, SB);
! }
! else if (dst->src.literal == 0xca)
! {
! dst->opcode = O (O_SYS_STAT, SB);
! }
! else if (dst->src.literal == 0xcb)
! {
! dst->opcode = O (O_SYS_FSTAT, SB);
! }
! /* End of Processing for system calls */
}
dst->next_pc = addr + len / 2;
*************** sim_resume (sd, step, siggnal)
*** 1392,1403 ****
goto condtrue;
goto next;
! case O (O_SYSCALL, SB):
{
! char c = cpu.regs[2];
! sim_callback->write_stdout (sim_callback, &c, 1);
}
goto next;
ONOT (O_NOT, rd = ~rd; v = 0;);
OSHIFTS (O_SHLL,
--- 1418,1679 ----
goto condtrue;
goto next;
! /* System call processing */
! case O (O_SYS_OPEN, SB) :
! {
! int len = 0; /* Length of filename */
! char *filename ; /* Filename would go here */
! char temp_char; /* Temporary character */
! int mode = 0; /* Mode bits for the file */
! int open_return; /* Return value of open, file descriptor */
! int i; /* Loop counter */
! int filename_ptr; /* Pointer to filename in cpu memory */
!
! /* Setting filename_ptr to first argument of open */
! filename_ptr = cpu.regs[0];
!
! /* Trying to get mode */
! if (h8300hmode || h8300smode)
! {
! mode = GET_MEMORY_L(cpu.regs[7] + 8);
! }
! else
! {
! mode = GET_MEMORY_W(cpu.regs[7] + 4);
! }
!
! /* Trying to find the length of the filename */
! temp_char = GET_MEMORY_B(cpu.regs[0]);
!
! len = 1;
! while (temp_char != '\0')
! {
! temp_char = GET_MEMORY_B (filename_ptr + len);
! len++;
! }
!
! /* Allocating space for the filename */
! filename = (char *)malloc(sizeof(char) * len);
!
! /* String copying the filename from memory */
! for (i = 0; i < len; i++)
! {
! temp_char = GET_MEMORY_B (filename_ptr + i);
! filename[i] = temp_char;
! }
!
! /* Callback to open and return the file descriptor */
! open_return = sim_callback->open (sim_callback, filename, mode);
!
! /* Return value in register 0 */
! cpu.regs[0] = open_return;
! }
! goto next;
!
! case O (O_SYS_READ, SB):
! {
! char *char_ptr ; /* Where characters read would be stored */
! int fd = cpu.regs[0]; /* File descriptor */
! int buf_size = cpu.regs[2]; /* BUF_SIZE parameter in read */
! int i = 0; /* Temporary Loop counter */
! int read_return = 0; /* Return value from callback to read */
!
! char_ptr = (char *)malloc(sizeof(char) * buf_size);
!
! /* Callback to read and return the no. of characters read */
! read_return = sim_callback->read (sim_callback, fd, char_ptr, buf_size);
!
! /* The characters read are stored in cpu memory */
! for (i = 0; i < buf_size; i++)
! {
! SET_MEMORY_B ((cpu.regs[1] + (sizeof(char) * i)), *(char_ptr + (sizeof(char) * i)));
! }
!
! /* Return value in Register 0 */
! cpu.regs[0] = read_return;
! }
! goto next;
!
! case O (O_SYS_WRITE, SB):
! {
! int fd = cpu.regs[0]; /* File descriptor */
! char temp_char; /* Temporary character */
! int len = cpu.regs[2]; /* Length of write, Parameter II to write */
! int char_ptr = cpu.regs[1]; /* Character Pointer, Parameter I of write */
! char *ptr; /* This characters to be written are stored */
! int write_return; /* Return value from write */
! int i = 0; /* Loop counter */
!
! /* Allocating space for the characters to be written */
! ptr = (char *)malloc(sizeof(char) * len);
!
! /* Fetching the characters from cpu memory */
! for (i = 0; i < len; i++)
! {
! temp_char = GET_MEMORY_B (char_ptr + i);
! ptr[i] = temp_char;
! }
!
! /* Callback write and return the no. of characters written */
! write_return = sim_callback->write (sim_callback, fd, ptr, len);
!
! /* Return value in Register 0 */
! cpu.regs[0] = write_return;
! }
! goto next;
!
! case O (O_SYS_LSEEK, SB):
! {
! int fd = cpu.regs[0]; /* File descriptor */
! int offset = cpu.regs[1]; /* Offset */
! int origin = cpu.regs[2]; /* Origin */
! int lseek_return; /* Return by lseek */
!
! /* Callback lseek and return offset */
! lseek_return = sim_callback->lseek (sim_callback, fd, offset, origin);
!
! /* Return value in register 0 */
! cpu.regs[0] = lseek_return;
! }
! goto next;
!
! case O (O_SYS_CLOSE, SB):
! {
! int fd = cpu.regs[0]; /* File descriptor */
! int close_return; /* Return by close */
!
! /* Callback close and return */
! close_return = sim_callback->close (sim_callback, fd);
!
! /* Return value in register 0 */
! cpu.regs[0] = close_return;
! }
! goto next;
!
! case O (O_SYS_FSTAT, SB):
! {
! int fd = cpu.regs[0]; /* File descriptor */
! struct stat stat_rec; /* Stat record */
! int fstat_return; /* Return value of stat */
! int stat_ptr; /* Pointer to stat record */
! char *temp_stat_ptr; /* Temporary stat_rec pointer */
! int buf_size = 0; /* Temporary variable for buffer size */
! int i = 0; /* Loop Counter */
! int j = 0; /* Temporary variable for Position in source */
! int short_size = sizeof (short); /* Sizeof short */
! int int_size = sizeof (int); /* Sizeof int */
!
! /* Setting stat_ptr to second argument of stat */
! stat_ptr = cpu.regs[1];
!
! /* Callback stat and return */
! fstat_return = sim_callback->fstat (sim_callback, fd, &stat_rec);
!
! /* Have stat_ptr point to starting of stat_rec */
! temp_stat_ptr = (char *)(&stat_rec);
!
! SET_MEMORY_W (stat_ptr, stat_rec.st_dev);
! stat_ptr += 2;
! SET_MEMORY_W (stat_ptr, stat_rec.st_ino);
! stat_ptr += 2;
! SET_MEMORY_L (stat_ptr, stat_rec.st_mode);
! stat_ptr += 4;
! SET_MEMORY_W (stat_ptr, stat_rec.st_nlink);
! stat_ptr += 2;
! SET_MEMORY_W (stat_ptr, stat_rec.st_uid);
! stat_ptr += 2;
! SET_MEMORY_W (stat_ptr, stat_rec.st_gid);
! stat_ptr += 2;
! SET_MEMORY_W (stat_ptr, stat_rec.st_rdev);
! stat_ptr += 2;
! SET_MEMORY_L (stat_ptr, stat_rec.st_size);
! stat_ptr += 4;
! SET_MEMORY_L (stat_ptr, stat_rec.st_atime);
! stat_ptr += 8;
! SET_MEMORY_L (stat_ptr, stat_rec.st_mtime);
! stat_ptr += 8;
! SET_MEMORY_L (stat_ptr, stat_rec.st_ctime);
!
! /* Return value in register 0 */
! cpu.regs[0] = fstat_return;
! }
! goto next;
!
! case O (O_SYS_STAT, SB):
{
! int len = 0; /* Length of filename */
! char *filename ; /* Filename would go here */
! char temp_char; /* Temporary character */
! int filename_ptr; /* Pointer to filename in cpu memory */
! struct stat stat_rec; /* Stat record */
! int stat_return; /* Return value of stat */
! int stat_ptr; /* Pointer to stat record */
! char *temp_stat_ptr; /* Temporary stat_rec pointer */
! int buf_size = 0; /* Temporary variable for buffer size */
! int i = 0; /* Loop Counter */
! int j = 0; /* Temporary variable for Position in source */
! int short_size = sizeof (short); /* Sizeof short */
! int int_size = sizeof (int); /* Sizeof int */
!
! /* Setting filename_ptr to first argument of open */
! filename_ptr = cpu.regs[0];
!
! /* Trying to find the length of the filename */
! temp_char = GET_MEMORY_B(cpu.regs[0]);
!
! len = 1;
! while (temp_char != '\0')
! {
! temp_char = GET_MEMORY_B (filename_ptr + len);
! len++;
! }
!
! /* Allocating space for the filename */
! filename = (char *)malloc(sizeof(char) * len);
!
! /* String copying the filename from memory */
! for (i = 0; i < len; i++)
! {
! temp_char = GET_MEMORY_B (filename_ptr + i);
! filename[i] = temp_char;
! }
!
! /* Setting stat_ptr to second argument of stat */
! stat_ptr = cpu.regs[1];
!
! /* Callback stat and return */
! stat_return = sim_callback->stat (sim_callback, filename, &stat_rec);
!
! /* Have stat_ptr point to starting of stat_rec */
! temp_stat_ptr = (char *)(&stat_rec);
!
! SET_MEMORY_W (stat_ptr, stat_rec.st_dev);
! stat_ptr += 2;
! SET_MEMORY_W (stat_ptr, stat_rec.st_ino);
! stat_ptr += 2;
! SET_MEMORY_L (stat_ptr, stat_rec.st_mode);
! stat_ptr += 4;
! SET_MEMORY_W (stat_ptr, stat_rec.st_nlink);
! stat_ptr += 2;
! SET_MEMORY_W (stat_ptr, stat_rec.st_uid);
! stat_ptr += 2;
! SET_MEMORY_W (stat_ptr, stat_rec.st_gid);
! stat_ptr += 2;
! SET_MEMORY_W (stat_ptr, stat_rec.st_rdev);
! stat_ptr += 2;
! SET_MEMORY_L (stat_ptr, stat_rec.st_size);
! stat_ptr += 4;
! SET_MEMORY_L (stat_ptr, stat_rec.st_atime);
! stat_ptr += 8;
! SET_MEMORY_L (stat_ptr, stat_rec.st_mtime);
! stat_ptr += 8;
! SET_MEMORY_L (stat_ptr, stat_rec.st_ctime);
!
! /* Return value in register 0 */
! cpu.regs[0] = stat_return;
}
goto next;
+ /* End of system call processing */
ONOT (O_NOT, rd = ~rd; v = 0;);
OSHIFTS (O_SHLL,
*** newlib/libc/sys/h8300hms/read.c.original Thu Nov 14 17:20:04 2002
--- newlib/libc/sys/h8300hms/read.c.modified Fri Nov 29 13:51:42 2002
*************** int _read(file, ptr, len)
*** 5,27 ****
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;
}
--- 5,11 ----
char *ptr;
int len;
{
! asm("jsr @@0xc6") ;
}
*** newlib/libc/sys/h8300hms/write.c.original Thu Nov 14 17:20:19 2002
--- newlib/libc/sys/h8300hms/write.c.modified Fri Nov 29 13:52:23 2002
*************** int _write(file, ptr, len)
*** 5,16 ****
char *ptr;
int len;
{
! int todo;
!
! for (todo = 0; todo < len; todo++)
! {
! asm("mov.b #0,r1l\n mov.b %0l,r2l\njsr @@0xc4" : : "r" (*ptr++) : "r1", "r2");
! }
! return len;
}
--- 5,10 ----
char *ptr;
int len;
{
! asm("jsr @@0xc7");
}
*** newlib/libc/sys/h8300hms/syscalls.c.original Thu Nov 14 17:19:38 2002
--- newlib/libc/sys/h8300hms/syscalls.c.modified Fri Nov 29 13:52:57 2002
***************
*** 4,23 ****
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
int _DEFUN(_lseek,(file, ptr, dir),
int file _AND
int ptr _AND
int dir)
{
! return 0;
}
int _DEFUN(_close,(file),
int file)
{
! return -1;
}
int isatty(file)
--- 4,31 ----
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
+ #include "sys/syscall.h"
+ int
+ _open (path, flags)
+ const char *path;
+ int flags;
+ {
+ asm("jsr @@0xc5");
+ }
int _DEFUN(_lseek,(file, ptr, dir),
int file _AND
int ptr _AND
int dir)
{
! asm("jsr @@0xc8");
}
int _DEFUN(_close,(file),
int file)
{
! asm("jsr @@0xc9");
}
int isatty(file)
*************** int isatty(file)
*** 26,45 ****
return 1;
}
! int _DEFUN(_fstat,(file, st),
! int file _AND
! struct stat *st)
{
! st->st_mode = S_IFCHR;
! return 0;
}
! int
! _open (path, flags)
! const char *path;
! int flags;
{
! return 0;
}
int
--- 34,52 ----
return 1;
}
! int _DEFUN(_stat,(path, sbuf),
! const char *path _AND
! struct stat *st)
{
! asm("jsr @@0xca");
}
!
! int _DEFUN(_fstat,(file, st),
! int file _AND
! struct stat *st)
{
! asm("jsr @@0xcb");
}
int
*** include/opcode/h8300.h.original Thu Nov 14 17:35:40 2002
--- include/opcode/h8300.h.modified Fri Nov 29 14:00:57 2002
*************** struct h8_opcode
*** 305,310 ****
--- 305,320 ----
#define O_STM 86
#define O_STMAC 87
#define O_LAST 88
+ /* Change made for System Call processing */
+ #define O_SYS_CREAT 100
+ #define O_SYS_OPEN 101
+ #define O_SYS_READ 102
+ #define O_SYS_WRITE 103
+ #define O_SYS_LSEEK 104
+ #define O_SYS_CLOSE 105
+ #define O_SYS_STAT 106
+ #define O_SYS_FSTAT 107
+ /* End of Changes */
#define SB 0
#define SW 1
#define SL 2
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic