diff packages/hal/common/current/src/generic-stub.c @ 156:b939e9cada46

Merge from eCos master repository on 2001-03-29-21:44:39-BST
author jlarmour
date Fri, 06 Apr 2001 17:20:13 +0000
parents e2d866e32dac
children 2395031e7a66
line wrap: on
line diff
--- a/packages/hal/common/current/src/generic-stub.c
+++ b/packages/hal/common/current/src/generic-stub.c
@@ -11,7 +11,7 @@
 int stubhex (unsigned char ch);
 static void getpacket (char *buffer);
 static void unlock_thread_scheduler (void);
-static uint32 crc32 (unsigned char *ptr, int len, uint32 crc);
+static uint32 crc32 (target_addr_t mem, int len, uint32 crc);
 #endif
 
 #include "thread-pkts.h"
@@ -456,6 +456,9 @@ int
 static int   hexMemCount;
 static char *hexMemSrc, *hexMemDst;
 static int   may_fault_mode;
+#ifdef TARGET_HAS_HARVARD_MEMORY
+static int   progMem;
+#endif
 
 /* Hamburger helper? */
 static void
@@ -481,6 +484,11 @@ static void
             } else {
                 len = 1;
             }
+#ifdef TARGET_HAS_HARVARD_MEMORY
+	    if (progMem)
+		__read_progmem_safe(&val.bytes[0], hexMemSrc, len);
+	    else
+#endif
             __read_mem_safe(&val.bytes[0], hexMemSrc, len);
         } else {
             len = 1;
@@ -523,6 +531,9 @@ char *
   hexMemSrc      = (unsigned char *) mem;
   hexMemCount    = count;
   may_fault_mode = may_fault;
+#ifdef TARGET_HAS_HARVARD_MEMORY
+  progMem = 0;
+#endif
   
   if (may_fault)
     {
@@ -537,6 +548,32 @@ char *
   return (char *) hexMemDst;
 }
 
+/* Convert the target memory identified by MEM into HEX, placing result in BUF.
+ * Return a pointer to the last char put in buf (NUL). In case of a memory
+ * fault, return 0.
+ */
+
+static char *
+__mem2hex_safe (target_addr_t mem, char *buf, int count)
+{
+  hexMemDst      = (unsigned char *) buf;
+  hexMemSrc      = (unsigned char *) TARGET_ADDR_TO_PTR(mem);
+  hexMemCount    = count;
+  may_fault_mode = 1;
+#ifdef TARGET_HAS_HARVARD_MEMORY
+  progMem = TARGET_ADDR_IS_PROGMEM(mem);
+#endif
+  
+  if (__set_mem_fault_trap (__mem2hex_helper))
+    return 0;
+
+  *hexMemDst = 0;
+
+  return (char *) hexMemDst;
+}
+
+
+
 static void
 __hex2mem_helper (void)
 {
@@ -574,9 +611,14 @@ static void
             val.bytes[i] = ch;
         }
 
-        if (may_fault_mode)
+        if (may_fault_mode) {
+#ifdef TARGET_HAS_HARVARD_MEMORY
+	    if (progMem)
+		__write_progmem_safe (&val.bytes[0], hexMemDst, len);
+	    else
+#endif
             __write_mem_safe (&val.bytes[0], hexMemDst, len);
-        else
+        } else
             *hexMemDst = ch;
 
         if (__mem_fault)
@@ -606,6 +648,9 @@ char *
   hexMemDst      = (unsigned char *) mem;
   hexMemCount    = count;
   may_fault_mode = may_fault;
+#ifdef TARGET_HAS_HARVARD_MEMORY
+  progMem = 0;
+#endif
 
   if (may_fault)
     {
@@ -618,6 +663,28 @@ char *
   return (char *) hexMemDst;
 }
 
+/* Convert COUNT bytes of the hex array pointed to by BUF into binary
+   to be placed in target MEM.  Return a pointer to the character AFTER
+   the last byte written.
+*/
+char *
+__hex2mem_safe (char *buf, target_addr_t mem, int count)
+{
+  hexMemSrc      = (unsigned char *) buf;
+  hexMemDst      = (unsigned char *) TARGET_ADDR_TO_PTR(mem);
+  hexMemCount    = count;
+  may_fault_mode = 1;
+#ifdef TARGET_HAS_HARVARD_MEMORY
+  progMem = TARGET_ADDR_IS_PROGMEM(mem);
+#endif
+
+  if (__set_mem_fault_trap (__hex2mem_helper))
+    return 0;
+
+  return (char *) hexMemDst;
+}
+
+
 void
 set_debug_traps (void)
 {
@@ -653,6 +720,35 @@ unsigned int
   return (numChars);
 }
 
+/*
+ * While we find nice hex chars, build a target memory address.
+ * Return number of chars processed.
+ */
+
+unsigned int
+__hexToAddr (char **ptr, target_addr_t *val)
+{
+  int numChars = 0;
+  int hexValue;
+
+  *val = 0;
+
+  while (**ptr)
+    {
+      hexValue = stubhex (**ptr);
+      if (hexValue < 0)
+        break;
+
+      *val = (*val << 4) | hexValue;
+      numChars ++;
+
+      (*ptr)++;
+    }
+
+  return (numChars);
+}
+
+
 /* 
  * Complement of __hexToInt: take an int of size "numBits", 
  * convert it to a hex string.  Return length of (unterminated) output.
@@ -1121,14 +1217,15 @@ int
     case 'm':     /* mAA..AA,LLLL  Read LLLL bytes at address AA..AA */
       /* Try to read %x,%x.  */
       {
-        target_register_t addr, length;
+        target_register_t length;
         char *ptr = &packet[1];
+        target_addr_t addr;
 
-        if (__hexToInt (&ptr, &addr)
+        if (__hexToAddr (&ptr, &addr)
             && *ptr++ == ','
             && __hexToInt (&ptr, &length))
           {
-            if (__mem2hex ((char *) addr, remcomOutBuffer, length, 1))
+	    if (__mem2hex_safe (addr, remcomOutBuffer, length))
               break;
 
             strcpy (remcomOutBuffer, "E03");
@@ -1145,12 +1242,13 @@ int
     case 'M': /* MAA..AA,LLLL: Write LLLL bytes at address AA.AA return OK */
       /* Try to read '%x,%x:'.  */
       {
-        target_register_t addr, length;
+        target_register_t length;
         char *ptr = &packet[1], buf[128];
         int  i;
+        target_addr_t addr;
 
-        if (__hexToInt (&ptr, &addr)
-            && *ptr++ == ','
+        if (__hexToAddr (&ptr, &addr)
+	    && *ptr++ == ','
             && __hexToInt (&ptr, &length)
             && *ptr++ == ':')
           {
@@ -1162,8 +1260,15 @@ int
                       if ((buf[i] = *ptr++) == 0x7d)
                         buf[i] = 0x20 | (*ptr++ & 0xff);
 
-                    if (__write_mem_safe (buf, (void *)addr, i) != i)
-                      break;
+#ifdef TARGET_HAS_HARVARD_MEMORY
+		    if (TARGET_ADDR_IS_PROGMEM(addr)) {
+		      if (__write_progmem_safe (buf, (void *)TARGET_ADDR_TO_PTR(addr), i) != i)
+                        break;
+		    } else
+#endif
+		      if (__write_mem_safe (buf, (void *)TARGET_ADDR_TO_PTR(addr), i) != i)
+			break;
+
 
                     length -= i;
                     addr += i;
@@ -1175,7 +1280,7 @@ int
               }
               else
               {
-                if (__hex2mem (ptr, (char *) addr, length, 1) != NULL)
+                if (__hex2mem_safe (ptr, addr, length) != NULL)
                   strcpy (remcomOutBuffer, "OK");
                 else
                   strcpy (remcomOutBuffer, "E03");
@@ -1194,7 +1299,7 @@ int
 
       {
         char *ptr = &packet[1];
-        target_register_t addr;
+        target_addr_t addr;
         target_register_t sigval = 0;
 
         if (packet[0] == 'C' || packet[0] == 'S')
@@ -1204,8 +1309,8 @@ int
               ptr++;
           }
 
-        if (__hexToInt (&ptr, &addr))
-          set_pc (addr);
+        if (__hexToAddr (&ptr, &addr))
+          set_pc ((target_register_t)TARGET_ADDR_TO_PTR(addr));
 
       /* Need to flush the instruction cache here, as we may have
          deposited a breakpoint, and the icache probably has no way of
@@ -1340,10 +1445,11 @@ int
 	char *ptr = &packet[1];
 	target_register_t ztype, addr, length;
 	int err;
+	target_addr_t taddr;
 
 	if (__hexToInt (&ptr, &ztype) && *(ptr++) == ',')
 	  {
-	    if (__hexToInt (&ptr, &addr))
+	    if (__hexToAddr (&ptr, &taddr))
 	      {
 		if (*(ptr++) == ',')
 		  {
@@ -1357,6 +1463,8 @@ int
 		else
 		  length = 0;
 
+		addr = (target_register_t)TARGET_ADDR_TO_PTR(taddr);
+
 		switch (ztype)
 		  {
 		    case 0:
@@ -1704,11 +1812,13 @@ static int tableInit = 0;
    PTR is assumed to be a pointer in the user program. */
 
 static uint32
-crc32 (ptr, len, crc)
-     unsigned char *ptr;
-     int len;
-     uint32 crc;
+crc32 (target_addr_t mem, int len, uint32 crc)
 {
+  unsigned char *ptr = (unsigned char *)TARGET_ADDR_TO_PTR(mem);
+#ifdef TARGET_HAS_HARVARD_MEMORY
+  int  is_progmem = TARGET_ADDR_IS_PROGMEM(mem);
+#endif
+
   if (! tableInit)
     {
       /* Initialize the CRC table and the decoding table. */
@@ -1729,6 +1839,11 @@ crc32 (ptr, len, crc)
     {
       unsigned char ch;
 
+#ifdef TARGET_HAS_HARVARD_MEMORY
+      if (is_progmem)
+	  __read_progmem_safe (&ch, (void *)ptr, 1);
+      else
+#endif
       __read_mem_safe (&ch, (void *)ptr, 1);
       if (__mem_fault)
         {
@@ -1755,16 +1870,16 @@ process_query (char *pkt)
   if (strncmp (pkt, "CRC:", 4) == 0)
 #endif // __ECOS__
     {
-      target_register_t startmem;
+      target_addr_t startmem;
       target_register_t length;
       uint32 our_crc;
 
       pkt += 4;
-      if (__hexToInt (&pkt, &startmem)
+      if (__hexToAddr (&pkt, &startmem)
           && *(pkt++) == ','
           && __hexToInt (&pkt, &length))
         {
-          our_crc = crc32 ((unsigned char *) startmem, length, 0xffffffff);
+          our_crc = crc32 (startmem, length, 0xffffffff);
           if (__mem_fault)
             {
               strcpy (remcomOutBuffer, "E01");