Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
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

             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