ARM SIM - add support to select SWI emulations to support.

Nick Clifton nickc@cambridge.redhat.com
Fri May 17 02:11:00 GMT 2002


Hi Guys,

  Here is the patch to the ARM simulator that allows the user to
  choose which SWI emulation(s) it will support.  This patch needs a
  seperate patch to the common sim code in order for the stand alone
  simualtor to gain this feature, but it will work right away with
  GDB.

  I am holding off applying this patch until the common part can be
  approved.

Cheers
        Nick


2002-05-17  Nick Clifton  <nickc@cambridge.redhat.com>

	* Makefile.in (SWI_TARGET_SWITCHES): Define.
	* armos.c (swi_mask): Define.  Initialise to supporting all
	SWI emulations.
	(ARMul_OSInit): For XScale targets, only support the ANGEL
	SWI interface.  (This is at the request if Intel).
	(ARMul_OSHandleSWI): Examine swi_mask to see if a particular
        SWI call should be emulated.
	Do not fall through from AngelSWI_Reason_WriteC.
	Propagate exit code from RedBoot Exit SWI.
	* rdi-dgb.h (swi_mask): Prototype.
	(SWI_MASK_DEMON, SWI_MASK_ANGEL, SWI_MASK_REDBOOT): Define.
	* wrapper.c (sim_target_parse_command_line): New function.
	Look for and handle --swi-support switch.
	(sim_target_parse_arg_array): New function.  Process an argv
	array for parsing by sim_target_parse_command_line.
	(sim_target_display_usage): New function.  Describe syntax of
	--swi-suppoort switch.
	(sim_open): Add call to sim_target_parse_arg_array).


Index: Makefile.in
===================================================================
RCS file: /cvs/src/src/sim/arm/Makefile.in,v
retrieving revision 1.3
diff -c -3 -p -w -r1.3 Makefile.in
*** Makefile.in	16 Nov 2001 18:56:01 -0000	1.3
--- Makefile.in	17 May 2002 08:58:54 -0000
***************
*** 18,24 ****
  
  ## COMMON_PRE_CONFIG_FRAG
  
! SIM_EXTRA_CFLAGS = -DMODET -DNEED_UI_LOOP_HOOK
  
  COPRO=@COPRO@
  
--- 18,24 ----
  
  ## COMMON_PRE_CONFIG_FRAG
  
! SIM_EXTRA_CFLAGS = -DMODET -DNEED_UI_LOOP_HOOK -DSIM_TARGET_SWITCHES
  
  COPRO=@COPRO@
  
Index: armos.c
===================================================================
RCS file: /cvs/src/src/sim/arm/armos.c,v
retrieving revision 1.13
diff -c -3 -p -w -r1.13 armos.c
*** armos.c	9 May 2002 10:29:08 -0000	1.13
--- armos.c	17 May 2002 08:58:54 -0000
*************** struct OSblock
*** 125,130 ****
--- 125,134 ----
  #define FIXCRLF(t,c) c
  #endif
  
+ /* Bit mask of enabled SWI implementations.  */
+ unsigned int swi_mask = -1;
+ 
+ 
  static ARMword softvectorcode[] =
  {
    /* Basic: swi tidyexception + event; mov pc, lr;
*************** ARMul_OSInit (ARMul_State * state)
*** 226,231 ****
--- 230,239 ----
  #endif /* VALIDATE */
  #endif /* NOOS */
  
+   /* Intel do not want DEMON SWI support.  */
+    if (state->is_XScale)
+     swi_mask = SWI_MASK_ANGEL;
+  
    return TRUE;
  }
  
*************** SWIflen (ARMul_State * state, ARMword fh
*** 397,445 ****
  unsigned
  ARMul_OSHandleSWI (ARMul_State * state, ARMword number)
  {
-   ARMword          addr;
-   ARMword          temp;
-   ARMword          saved_number = 0;
    struct OSblock * OSptr = (struct OSblock *) state->OSptr;
!   
!   /* Intel do not want DEMON SWI support.  */
!   if (state->is_XScale)
!     switch (number)
!     {
!     case SWI_Read:
!     case SWI_Write:
!     case SWI_Open:
!     case SWI_Clock:
!     case SWI_Time:
!     case SWI_Close:
!     case SWI_Flen:
!     case SWI_Exit:
!     case SWI_Seek:
!     case SWI_WriteC:
!     case SWI_Write0:
!     case SWI_GetErrno:
!     case SWI_GetEnv:
!       saved_number = number;
!       number = -1;
!     default:
!       break;
!     }
    
    switch (number)
      {
      case SWI_Read:
        SWIread (state, state->Reg[0], state->Reg[1], state->Reg[2]);
        break;
  
      case SWI_Write:
        SWIwrite (state, state->Reg[0], state->Reg[1], state->Reg[2]);
        break;
  
      case SWI_Open:
        SWIopen (state, state->Reg[0], state->Reg[1]);
        break;
  
      case SWI_Clock:
        /* Return number of centi-seconds.  */
        state->Reg[0] =
  #ifdef CLOCKS_PER_SEC
--- 405,439 ----
  unsigned
  ARMul_OSHandleSWI (ARMul_State * state, ARMword number)
  {
    struct OSblock * OSptr = (struct OSblock *) state->OSptr;
!   int              unhandled = FALSE;
  
    switch (number)
      {
      case SWI_Read:
+       if (swi_mask & SWI_MASK_DEMON)
  	SWIread (state, state->Reg[0], state->Reg[1], state->Reg[2]);
+       else
+ 	unhandled = TRUE;
        break;
  
      case SWI_Write:
+       if (swi_mask & SWI_MASK_DEMON)
  	SWIwrite (state, state->Reg[0], state->Reg[1], state->Reg[2]);
+       else
+ 	unhandled = TRUE;
        break;
  
      case SWI_Open:
+       if (swi_mask & SWI_MASK_DEMON)
  	SWIopen (state, state->Reg[0], state->Reg[1]);
+       else
+ 	unhandled = TRUE;
        break;
  
      case SWI_Clock:
+       if (swi_mask & SWI_MASK_DEMON)
+ 	{
  	  /* Return number of centi-seconds.  */
  	  state->Reg[0] =
  #ifdef CLOCKS_PER_SEC
*************** ARMul_OSHandleSWI (ARMul_State * state, 
*** 451,499 ****
--- 445,528 ----
  	  (ARMword) (clock () / 10000);
  #endif
  	  OSptr->ErrorNo = errno;
+ 	}
+       else
+ 	unhandled = TRUE;
        break;
  
      case SWI_Time:
+       if (swi_mask & SWI_MASK_DEMON)
+ 	{
  	  state->Reg[0] = (ARMword) sim_callback->time (sim_callback, NULL);
  	  OSptr->ErrorNo = sim_callback->get_errno (sim_callback);
+ 	}
+       else
+ 	unhandled = TRUE;
        break;
  
      case SWI_Close:
+       if (swi_mask & SWI_MASK_DEMON)
+ 	{
  	  state->Reg[0] = sim_callback->close (sim_callback, state->Reg[0]);
  	  OSptr->ErrorNo = sim_callback->get_errno (sim_callback);
+ 	}
+       else
+ 	unhandled = TRUE;
        break;
  
      case SWI_Flen:
+       if (swi_mask & SWI_MASK_DEMON)
  	SWIflen (state, state->Reg[0]);
+       else
+ 	unhandled = TRUE;
        break;
  
      case SWI_Exit:
+       if (swi_mask & SWI_MASK_DEMON)
  	state->Emulate = FALSE;
+       else
+ 	unhandled = TRUE;
        break;
  
      case SWI_Seek:
+       if (swi_mask & SWI_MASK_DEMON)
+ 	{
  	  /* We must return non-zero for failure.  */
  	  state->Reg[0] = -1 >= sim_callback->lseek (sim_callback, state->Reg[0], state->Reg[1], SEEK_SET);
  	  OSptr->ErrorNo = sim_callback->get_errno (sim_callback);
+ 	}
+       else
+ 	unhandled = TRUE;
        break;
  
      case SWI_WriteC:
+       if (swi_mask & SWI_MASK_DEMON)
  	{
  	  char tmp = state->Reg[0];
  	  (void) sim_callback->write_stdout (sim_callback, &tmp, 1);
  	  OSptr->ErrorNo = sim_callback->get_errno (sim_callback);
  	}
+       else
+ 	unhandled = TRUE;
        break;
  
      case SWI_Write0:
+       if (swi_mask & SWI_MASK_DEMON)
  	SWIWrite0 (state, state->Reg[0]);
+       else
+ 	unhandled = TRUE;
        break;
  
      case SWI_GetErrno:
+       if (swi_mask & SWI_MASK_DEMON)
  	state->Reg[0] = OSptr->ErrorNo;
+       else
+ 	unhandled = TRUE;
        break;
  
      case SWI_GetEnv:
+       if (swi_mask & SWI_MASK_DEMON)
+ 	{
  	  state->Reg[0] = ADDRCMDLINE;
  	  if (state->MemSize)
  	    state->Reg[1] = state->MemSize;
*************** ARMul_OSHandleSWI (ARMul_State * state, 
*** 501,506 ****
--- 530,538 ----
  	    state->Reg[1] = ADDRUSERSTACK;
  
  	  WriteCommandLineTo (state, state->Reg[0]);
+ 	}
+       else
+ 	unhandled = TRUE;
        break;
  
      case SWI_Breakpoint:
*************** ARMul_OSHandleSWI (ARMul_State * state, 
*** 511,516 ****
--- 543,553 ----
        /* Handle Angel SWIs as well as Demon ones.  */
      case AngelSWI_ARM:
      case AngelSWI_Thumb:
+       if (swi_mask & SWI_MASK_ANGEL)
+ 	{
+ 	  ARMword addr;
+ 	  ARMword temp;
+ 
  	  /* R1 is almost always a parameter block.  */
  	  addr = state->Reg[1];
  	  /* R0 is a reason code.  */
*************** ARMul_OSHandleSWI (ARMul_State * state, 
*** 552,559 ****
  	    char tmp = ARMul_SafeReadByte (state, addr);
  	    (void) sim_callback->write_stdout (sim_callback, &tmp, 1);
  	    OSptr->ErrorNo = sim_callback->get_errno (sim_callback);
  	  }
- 	  /* Fall thgrough.  */
  
  	case AngelSWI_Reason_Write0:
  	  SWIWrite0 (state, addr);
--- 589,596 ----
  		char tmp = ARMul_SafeReadByte (state, addr);
  		(void) sim_callback->write_stdout (sim_callback, &tmp, 1);
  		OSptr->ErrorNo = sim_callback->get_errno (sim_callback);
+ 		break;
  	      }
  
  	    case AngelSWI_Reason_Write0:
  	      SWIWrite0 (state, addr);
*************** ARMul_OSHandleSWI (ARMul_State * state, 
*** 637,642 ****
--- 674,683 ----
  			ARMul_ReadWord (state, addr + 8));
  	      break;
  	    }
+ 	}
+       else
+ 	unhandled = TRUE;
+       break;
  
      case 0x90:
      case 0x91:
*************** ARMul_OSHandleSWI (ARMul_State * state, 
*** 645,650 ****
--- 686,693 ----
        break;
        
      case 0x180001: /* RedBoot's Syscall SWI in ARM mode.  */
+       if (swi_mask & SWI_MASK_REDBOOT)
+ 	{
  	  switch (state->Reg[0])
  	    {
  	      /* These numbers are defined in libgloss/syscall.h
*************** ARMul_OSHandleSWI (ARMul_State * state, 
*** 652,675 ****
  	     libgloss being installed.  */
  	case 1:  /* Exit.  */
  	  state->Emulate = FALSE;
! 	  return TRUE;
  
  	case 2:  /* Open.  */
  	  SWIopen (state, state->Reg[1], state->Reg[2]);
! 	  return TRUE;
  
  	case 3:  /* Close.  */
  	  state->Reg[0] = sim_callback->close (sim_callback, state->Reg[1]);
  	  OSptr->ErrorNo = sim_callback->get_errno (sim_callback);
! 	  return TRUE;
  
  	case 4:  /* Read.  */
  	  SWIread (state, state->Reg[1], state->Reg[2], state->Reg[3]);
! 	  return TRUE;
  
  	case 5:  /* Write.  */
  	  SWIwrite (state, state->Reg[1], state->Reg[2], state->Reg[3]);
! 	  return TRUE;
  
  	case 6:  /* Lseek.  */
  	  state->Reg[0] = sim_callback->lseek (sim_callback,
--- 695,720 ----
  		 libgloss being installed.  */
  	    case 1:  /* Exit.  */
  	      state->Emulate = FALSE;
! 	      /* Copy exit code into r0.  */
! 	      state->Reg[0] = state->Reg[1];
! 	      break;
  
  	    case 2:  /* Open.  */
  	      SWIopen (state, state->Reg[1], state->Reg[2]);
! 	      break;
  
  	    case 3:  /* Close.  */
  	      state->Reg[0] = sim_callback->close (sim_callback, state->Reg[1]);
  	      OSptr->ErrorNo = sim_callback->get_errno (sim_callback);
! 	      break;
  
  	    case 4:  /* Read.  */
  	      SWIread (state, state->Reg[1], state->Reg[2], state->Reg[3]);
! 	      break;
  
  	    case 5:  /* Write.  */
  	      SWIwrite (state, state->Reg[1], state->Reg[2], state->Reg[3]);
! 	      break;
  
  	    case 6:  /* Lseek.  */
  	      state->Reg[0] = sim_callback->lseek (sim_callback,
*************** ARMul_OSHandleSWI (ARMul_State * state, 
*** 677,689 ****
  					       state->Reg[2],
  					       state->Reg[3]);
  	  OSptr->ErrorNo = sim_callback->get_errno (sim_callback);
! 	  return TRUE;
  
  	case 17: /* Utime.  */
  	  state->Reg[0] = (ARMword) sim_callback->time (sim_callback,
  							(long *) state->Reg[1]);
  	  OSptr->ErrorNo = sim_callback->get_errno (sim_callback);
! 	  return TRUE;
  
  	case 7:  /* Unlink.  */
  	case 8:  /* Getpid.  */
--- 722,734 ----
  						   state->Reg[2],
  						   state->Reg[3]);
  	      OSptr->ErrorNo = sim_callback->get_errno (sim_callback);
! 	      break;
  
  	    case 17: /* Utime.  */
  	      state->Reg[0] = (ARMword) sim_callback->time (sim_callback,
  							    (long *) state->Reg[1]);
  	      OSptr->ErrorNo = sim_callback->get_errno (sim_callback);
! 	      break;
  
  	    case 7:  /* Unlink.  */
  	    case 8:  /* Getpid.  */
*************** ARMul_OSHandleSWI (ARMul_State * state, 
*** 709,722 ****
  	     state->Reg[0]);
  	  return FALSE;
  	}
!       return TRUE;
        
      default:
!       /* If there is a SWI vector installed use it.  */
!       if (state->is_XScale && saved_number != -1)
! 	number = saved_number;
  	    
!       if (SWI_vector_installed && number != SWI_Breakpoint)
  	{
  	  ARMword cpsr;
  	  ARMword i_size;
--- 754,769 ----
  		 state->Reg[0]);
  	      return FALSE;
  	    }
! 	  break;
! 	}
        
      default:
!       unhandled = TRUE;
!     }
        
!   if (unhandled)
!     {
!       if (SWI_vector_installed)
  	{
  	  ARMword cpsr;
  	  ARMword i_size;

Index: dbg_rdi.h
===================================================================
RCS file: /cvs/src/src/sim/arm/dbg_rdi.h,v
retrieving revision 1.1.1.2
diff -c -3 -p -w -r1.1.1.2 dbg_rdi.h
*** dbg_rdi.h	5 Feb 2000 07:30:19 -0000	1.1.1.2
--- dbg_rdi.h	17 May 2002 08:58:54 -0000
*************** struct RDIProcVec
*** 330,332 ****
--- 330,338 ----
  };
  
  #endif
+ 
+ extern unsigned int swi_mask;
+ 
+ #define SWI_MASK_DEMON		(1 << 0)
+ #define SWI_MASK_ANGEL		(1 << 1)
+ #define SWI_MASK_REDBOOT	(1 << 2)

Index: wrapper.c
===================================================================
RCS file: /cvs/src/src/sim/arm/wrapper.c,v
retrieving revision 1.18
diff -c -3 -p -w -r1.18 wrapper.c
*** wrapper.c	18 Mar 2002 21:43:15 -0000	1.18
--- wrapper.c	17 May 2002 08:58:54 -0000
*************** sim_fetch_register (sd, rn, memory, leng
*** 426,431 ****
--- 426,544 ----
    return -1;
  }
  
+ #ifdef SIM_TARGET_SWITCHES
+ 
+ static void sim_target_parse_arg_array PARAMS ((char **));
+ 
+ typedef struct
+ {
+   char * 	swi_option;
+   unsigned int	swi_mask;
+ } swi_options;
+ 
+ #define SWI_SWITCH	"--swi-support"
+ 
+ static swi_options options[] =
+   {
+     { "none",    0 },
+     { "demon",   SWI_MASK_DEMON },
+     { "angel",   SWI_MASK_ANGEL },
+     { "redboot", SWI_MASK_REDBOOT },
+     { "all",     -1 },
+     { "NONE",    0 },
+     { "DEMON",   SWI_MASK_DEMON },
+     { "ANGEL",   SWI_MASK_ANGEL },
+     { "REDBOOT", SWI_MASK_REDBOOT },
+     { "ALL",     -1 }
+   };
+ 
+ 
+ int
+ sim_target_parse_command_line (argc, argv)
+      int argc;
+      char ** argv;
+ {
+   int i;
+ 
+   for (i = 1; i < argc; i++)
+     {
+       char * ptr = argv[i];
+       int arg;
+ 
+       if ((ptr == NULL) || (* ptr != '-'))
+ 	break;
+ 
+       if (strncmp (ptr, SWI_SWITCH, sizeof SWI_SWITCH - 1) != 0)
+ 	continue;
+ 
+       if (ptr[sizeof SWI_SWITCH - 1] == 0)
+ 	{
+ 	  /* Remove this option from the argv array.  */
+ 	  for (arg = i; arg < argc; arg ++)
+ 	    argv[arg] = argv[arg + 1];
+ 	  argc --;
+ 	  
+ 	  ptr = argv[i];
+ 	}
+       else
+ 	ptr += sizeof SWI_SWITCH;
+ 
+       swi_mask = 0;
+       
+       while (* ptr)
+ 	{
+ 	  int i;
+ 
+ 	  for (i = sizeof options / sizeof options[0]; i--;)
+ 	    if (strncmp (ptr, options[i].swi_option,
+ 			 strlen (options[i].swi_option)) == 0)
+ 	      {
+ 		swi_mask |= options[i].swi_mask;
+ 		ptr += strlen (options[i].swi_option);
+ 
+ 		if (* ptr == ',')
+ 		  ++ ptr;
+ 
+ 		break;
+ 	      }
+ 
+ 	  if (i < 0)
+ 	    break;
+ 	}
+ 
+       if (* ptr != 0)
+ 	fprintf (stderr, "Ignoring swi options: %s\n", ptr);
+       
+       /* Remove this option from the argv array.  */
+       for (arg = i; arg < argc; arg ++)
+ 	argv[arg] = argv[arg + 1];
+       argc --;
+       i --;
+     }
+   return argc;
+ }
+ 
+ static void
+ sim_target_parse_arg_array (argv)
+      char ** argv;
+ {
+   int i;
+ 
+   for (i = 0; argv[i]; i++)
+     ;
+ 
+   return (void) sim_target_parse_command_line (i, argv);
+ }
+ 
+ void
+ sim_target_display_usage ()
+ {
+   fprintf (stderr, "%s=<list>  Comma seperated list of SWI protocols to supoport.\n\
+                 This list can contain: NONE, DEMON, ANGEL, REDBOOT and/or ALL.\n",
+ 	   SWI_SWITCH);
+ }
+ #endif
+ 
  SIM_DESC
  sim_open (kind, ptr, abfd, argv)
       SIM_OPEN_KIND kind;
*************** sim_open (kind, ptr, abfd, argv)
*** 438,443 ****
--- 551,560 ----
    myname = (char *) xstrdup (argv[0]);
    sim_callback = ptr;
  
+ #ifdef SIM_TARGET_SWITCHES
+   sim_target_parse_arg_array (argv);
+ #endif
+   
    /* Decide upon the endian-ness of the processor.
       If we can, get the information from the bfd itself.
       Otherwise look to see if we have been given a command



More information about the Gdb-patches mailing list