diff packages/hal/common/current/src/hal_stub.c @ 34:29bc183297e1 ecos-sw-1999-09-02

Merge from eCos master repository on 1999-09-02-16:26:10-BST
author jlarmour
date Thu, 02 Sep 1999 16:11:22 +0000
parents 641b639be825
children e7ba79f6d3a8
line wrap: on
line diff
--- a/packages/hal/common/current/src/hal_stub.c
+++ b/packages/hal/common/current/src/hal_stub.c
@@ -390,13 +390,13 @@ void
     *ptr++ = __tohex (PC);
     *ptr++ = ':';
     addr = get_register (PC);
-    ptr = __mem2hex((char *)&addr, ptr, sizeof(addr), 0);
+    ptr = __mem2hex((char *)&addr, ptr, REGSIZE(PC), 0);
     *ptr++ = ';';
 
     *ptr++ = __tohex (SP >> 4);
     *ptr++ = __tohex (SP);
     *ptr++ = ':';
-    ptr = __mem2hex((char *)&sp, ptr, sizeof(sp), 0);
+    ptr = __mem2hex((char *)&sp, ptr, REGSIZE(SP), 0);
     *ptr++ = ';';
     
     *ptr++ = 0;
@@ -481,20 +481,51 @@ static volatile target_register_t memCou
 static void
 __do_copy_mem (unsigned char* src, unsigned char* dst)
 {
-  __mem_fault = 1;                      // Defaults to 'fail'. Is cleared
-                                        // when the copy loop completes.
-  __mem_fault_handler = &&err;
+    unsigned long *long_dst;
+    unsigned long *long_src;
+    unsigned short *short_dst;
+    unsigned short *short_src;
+
+    __mem_fault = 1;                      /* Defaults to 'fail'. Is cleared */
+                                          /* when the copy loop completes.  */
+    __mem_fault_handler = &&err;
+
+    // See if it's safe to do multi-byte, aligned operations
+    while (memCount) {
+        if ((memCount >= sizeof(long)) &&
+            (((target_register_t)dst & (sizeof(long)-1)) == 0) &&
+            (((target_register_t)src & (sizeof(long)-1)) == 0)) {
+        
+            long_dst = (unsigned long *)dst;
+            long_src = (unsigned long *)src;
 
-  while (memCount)
-    {
-      *dst++ = *src++;
-      memCount--;
+            *long_dst++ = *long_src++;
+            memCount -= sizeof(long);
+
+            dst = (unsigned char *)long_dst;
+            src = (unsigned char *)long_src;
+        } else if ((memCount >= sizeof(short)) &&
+                   (((target_register_t)dst & (sizeof(short)-1)) == 0) &&
+                   (((target_register_t)src & (sizeof(short)-1)) == 0)) {
+            
+            short_dst = (unsigned short *)dst;
+            short_src = (unsigned short *)src;
+
+            *short_dst++ = *short_src++;
+            memCount -= sizeof(short);
+
+            dst = (unsigned char *)short_dst;
+            src = (unsigned char *)short_src;
+        } else {
+            *dst++ = *src++;
+            memCount--;
+        }
     }
 
-  __mem_fault = 0;
+    __mem_fault = 0;
 
  err:
-  __mem_fault_handler = (void *)0;
+    __mem_fault_handler = (void *)0;
 }
 
 /*
@@ -503,7 +534,7 @@ static void
  */
 
 int
-__read_mem_safe (unsigned char *dst, target_register_t src, int count)
+__read_mem_safe (void *dst, void *src, int count)
 {
   memCount = count;
   __do_copy_mem((unsigned char*) src, (unsigned char*) dst);
@@ -516,7 +547,7 @@ int
  */
 
 int
-__write_mem_safe (unsigned char *src, target_register_t dst, int count)
+__write_mem_safe (void *src, void *dst, int count)
 {
   memCount = count;
   __do_copy_mem((unsigned char*) src, (unsigned char*) dst);