From: "D.Venkatasubramanian, Noida" <dvenkat@noida.hcltech.com>
To: Kazu Hirata <kazu@cs.umass.edu>,
gdb-patches@sources.redhat.com, binutils@sources.redhat.com,
newlib@sources.redhat.com
Subject: RE: PATCH : H8300 Simulator File I/O Implementation
Date: Thu, 26 Dec 2002 04:38:00 -0000 [thread overview]
Message-ID: <E04CF3F88ACBD5119EFE00508BBB21210688A4F3@exch-01.noida.hcltech.com> (raw)
[-- Attachment #1: Type: text/plain, Size: 2014 bytes --]
> -----Original Message-----
> From: Kazu Hirata [mailto:kazu@cs.umass.edu]
>
> I would split the gdb part of your patch into the opcodes part and the
> rest because opcodes is part of binutils.
Done, I am attaching three patches, One for the simulator, one for
binutils and one for newlib.
>
> I am guessing that you probably don't need to change the order of
> functions in newlib/libc/sys/h8300hms/syscalls.c. You might want to
> submit a patch with few or no formatting changes to make your real
> changes exposed. See the attached patch below. Also, please use
> "asm (...)" instead of "asm(...)".
>
Done that too.
> For the gdb part, I would run 'indent' to see what it recommends. One
> thing it suggests should be to change
>
> ! filename = (char *)malloc(sizeof(char) * len);
>
> to something like
>
> ! filename = (char *) malloc (sizeof (char) * len);
>
> Some variables seem to be unused.
>
Made changes as suggested by indent.
Hope to have removed all the useless variables and indentation problems.
Thanks and Regards,
Venky
Mon Dec 26 16:44:35 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.
Mon Dec 26 16:47:01 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.
Mon Dec 26 16:47:09 IST 2002 D.Venkatasubramanian
<dvenkat@noida.hcltech.com>
*h8300.h: Added some more pseudo opcodes for system call processing.
[-- Attachment #2: simulator_patch.txt --]
[-- Type: text/plain, Size: 10792 bytes --]
*** sim/h8300/compile.c.original Thu Dec 26 17:15:41 2002
--- sim/h8300/compile.c.modified Thu Dec 26 17:34:15 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)
*** 452,461 ****
if (dst->opcode == O (O_JSR, SB))
{
! if (dst->src.literal == 0xc4)
{
! dst->opcode = O (O_SYSCALL, SB);
}
}
dst->next_pc = addr + len / 2;
--- 454,484 ----
if (dst->opcode == O (O_JSR, SB))
{
! switch (dst->src.literal)
{
! case 0xc5:
! dst->opcode = O (O_SYS_OPEN, SB);
! break;
! case 0xc6:
! dst->opcode = O (O_SYS_READ, SB);
! break;
! case 0xc7:
! dst->opcode = O (O_SYS_WRITE, SB);
! break;
! case 0xc8:
! dst->opcode = O (O_SYS_LSEEK, SB);
! break;
! case 0xc9:
! dst->opcode = O (O_SYS_CLOSE, SB);
! break;
! case 0xca:
! dst->opcode = O (O_SYS_STAT, SB);
! break;
! case 0xcb:
! dst->opcode = O (O_SYS_FSTAT, SB);
! break;
}
+ /* 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,
--- 1415,1689 ----
goto condtrue;
goto next;
! /* System call processing starts. */
! 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;
!
! /* Freeing memory used for filename. */
! free (filename);
! }
! 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;
!
! /* Freeing memory used as buffer. */
! free (char_ptr);
! }
! 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; /* Where characters to be written are stored.
! */
! int write_return; /* Return value from callback to 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;
!
! /* Freeing memory used as buffer. */
! free (ptr);
! }
! 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 value from callback to 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 value from callback to 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 from callback to stat. */
! int stat_ptr; /* Pointer to stat record. */
! char *temp_stat_ptr; /* Temporary stat_rec pointer. */
!
! /* 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);
!
! /* Setting up the stat structure returned. */
! 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 from callback to stat */
! int stat_ptr; /* Pointer to stat record. */
! char *temp_stat_ptr; /* Temporary stat_rec pointer. */
! int i = 0; /* Loop Counter */
!
! /* 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);
!
! /* Freeing memory used for filename. */
! free (filename);
!
! /* Setting up the stat structure returned. */
! 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,
[-- Attachment #3: newlib_patch.txt --]
[-- Type: text/plain, Size: 3082 bytes --]
*** newlib/libc/sys/h8300hms/syscalls.c.original Thu Nov 14 17:19:38 2002
--- newlib/libc/sys/h8300hms/syscalls.c.modified Thu Dec 26 17:05:50 2002
***************
*** 4,9 ****
--- 4,10 ----
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
+ #include "sys/syscall.h"
int _DEFUN(_lseek,(file, ptr, dir),
*************** int _DEFUN(_lseek,(file, ptr, dir),
*** 11,23 ****
int ptr _AND
int dir)
{
! return 0;
}
int _DEFUN(_close,(file),
int file)
{
! return -1;
}
int isatty(file)
--- 12,24 ----
int ptr _AND
int dir)
{
! asm ("jsr @@0xc8");
}
int _DEFUN(_close,(file),
int file)
{
! asm ("jsr @@0xc9");
}
int isatty(file)
*************** int _DEFUN(_fstat,(file, st),
*** 30,37 ****
int file _AND
struct stat *st)
{
! st->st_mode = S_IFCHR;
! return 0;
}
int
--- 31,37 ----
int file _AND
struct stat *st)
{
! asm ("jsr @@0xcb");
}
int
*************** _open (path, flags)
*** 39,45 ****
const char *path;
int flags;
{
! return 0;
}
int
--- 39,45 ----
const char *path;
int flags;
{
! asm ("jsr @@0xc5");
}
int
*************** _unlink (path)
*** 49,51 ****
--- 49,59 ----
errno = EIO;
return -1;
}
+
+ int _DEFUN(_stat,(path, sbuf),
+ const char *path _AND
+ struct stat *st)
+ {
+ asm ("jsr @@0xca");
+ }
+
*** newlib/libc/sys/h8300hms/read.c.original Thu Nov 14 17:20:04 2002
--- newlib/libc/sys/h8300hms/read.c.modified Thu Dec 26 17:05:58 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 Thu Dec 26 17:06:06 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");
}
[-- Attachment #4: binutils_patch.txt --]
[-- Type: text/plain, Size: 616 bytes --]
*** include/opcode/h8300.h.original Thu Nov 14 17:35:40 2002
--- include/opcode/h8300.h.modified Mon Dec 2 17:11:07 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 System Call specific Changes. */
#define SB 0
#define SW 1
#define SL 2
next reply other threads:[~2002-12-26 12:11 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2002-12-26 4:38 D.Venkatasubramanian, Noida [this message]
-- strict thread matches above, loose matches on Subject: below --
2003-01-14 4:56 D.Venkatasubramanian, Noida
2003-01-08 5:08 D.Venkatasubramanian, Noida
2003-01-03 8:30 D.Venkatasubramanian, Noida
2003-01-07 22:00 ` Kazu Hirata
2003-01-07 23:08 ` Andrew Cagney
2002-12-31 2:00 D.Venkatasubramanian, Noida
2002-12-31 4:42 ` Kazu Hirata
2002-12-26 10:12 D.Venkatasubramanian, Noida
2002-12-23 22:59 D.Venkatasubramanian, Noida
2002-12-24 6:51 ` Kazu Hirata
2002-12-02 3:45 D.Venkatasubramanian, Noida
2002-11-29 21:31 D.Venkatasubramanian, Noida
2002-11-30 10:01 ` Kazu Hirata
2003-03-04 16:08 ` Andrew Cagney
2003-03-04 16:33 ` Kazu Hirata
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=E04CF3F88ACBD5119EFE00508BBB21210688A4F3@exch-01.noida.hcltech.com \
--to=dvenkat@noida.hcltech.com \
--cc=binutils@sources.redhat.com \
--cc=gdb-patches@sources.redhat.com \
--cc=kazu@cs.umass.edu \
--cc=newlib@sources.redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox