diff packages/hal/powerpc/arch/current/include/hal_intr.h @ 76:435cced73e2f ecos-v1_3_1-release

eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
author jlarmour
date Tue, 28 Mar 2000 14:10:45 +0000
parents c5536bad4c24
children 2085233a121a
line wrap: on
line diff
--- a/packages/hal/powerpc/arch/current/include/hal_intr.h
+++ b/packages/hal/powerpc/arch/current/include/hal_intr.h
@@ -98,7 +98,6 @@
 #define CYGNUM_HAL_INTERRUPT_DECREMENTER     0
 #define CYGNUM_HAL_INTERRUPT_EXTERNAL        1
 
-// CYGNUM_HAL_ISR_COUNT must match CYG_ISR_TABLE_SIZE defined in vectors.S.
 #define CYGNUM_HAL_ISR_MIN                   CYGNUM_HAL_INTERRUPT_DECREMENTER
 #ifndef CYGNUM_HAL_ISR_MAX
 # define CYGNUM_HAL_ISR_MAX                  CYGNUM_HAL_INTERRUPT_EXTERNAL
@@ -172,57 +171,50 @@ typedef cyg_uint32 CYG_INTERRUPT_STATE;
 //--------------------------------------------------------------------------
 // Interrupt control macros
 
-#define HAL_DISABLE_INTERRUPTS(_old_)   \
-    asm volatile (                      \
-        "mfmsr  %0;"                    \
-        "lis    4,0;"                   \
-        "ori    4,4,0x8000 ;"           \
-        "not    5,4;"                   \
-        "and    5,%0,5;"                \
-        "mtmsr  5;"                     \
-        "and    %0,%0,4"                \
-        : "=r"(_old_)                   \
-        :                               \
-        : "r4", "r5"                    \
-        );
+#define HAL_DISABLE_INTERRUPTS(_old_)                   \
+    CYG_MACRO_START                                     \
+    cyg_uint32 tmp1, tmp2;                              \
+    asm volatile (                                      \
+        "mfmsr  %0;"                                    \
+        "mr     %2,%0;"                                 \
+        "li     %1,0;"                                  \
+        "rlwimi %2,%1,0,16,16;"                         \
+        "mtmsr  %2;"                                    \
+        : "=r"(_old_), "=r" (tmp1), "=r" (tmp2));       \
+    CYG_MACRO_END
 
 #define HAL_ENABLE_INTERRUPTS()         \
+    CYG_MACRO_START                     \
+    cyg_uint32 tmp1, tmp2;              \
     asm volatile (                      \
-        "mfmsr  3;"                     \
-        "lis    4,0;"                   \
-        "ori    4,4,0x8000 ;"           \
-        "or     3,3,4;"                 \
-        "mtmsr  3;"                     \
-        :                               \
-        :                               \
-        : "r3", "r4"                    \
-        );
+        "mfmsr  %0;"                    \
+        "ori    %1,%1,0x8000;"          \
+        "rlwimi %0,%1,0,16,16;"         \
+        "mtmsr  %0;"                    \
+        : "=r" (tmp1), "=r" (tmp2));    \
+    CYG_MACRO_END
 
 #define HAL_RESTORE_INTERRUPTS(_old_)   \
-    asm volatile (                      \
-        "mfmsr  3;"                     \
-        "lis    4,0;"                   \
-        "ori    4,4,0x8000 ;"           \
-        "and    4,%0,4;"                \
-        "or     4,3,4;"                 \
-        "mtmsr  4;"                     \
-        :                               \
-        : "r"(_old_)                    \
-        : "r3", "r4"                    \
-        );
-
-// FIXME: using andi with side-effect on cc would be better but causes
-// compiler problem.
-#define HAL_QUERY_INTERRUPTS(_old_)     \
+    CYG_MACRO_START                     \
+    cyg_uint32 tmp;                     \
     asm volatile (                      \
         "mfmsr  %0;"                    \
-        "lis    4,0;"                   \
-        "ori    4,4,0x8000;"            \
-        "and    %0,%0,4;"               \
-        : "=r"(_old_)                   \
-        :                               \
-        : "r4"                          \
-        );
+        "rlwimi %0,%1,0,16,16;"         \
+        "mtmsr  %0;"                    \
+        : "=&r" (tmp)                   \
+        : "r" (_old_));                 \
+    CYG_MACRO_END
+
+#define HAL_QUERY_INTERRUPTS(_old_)     \
+    CYG_MACRO_START                     \
+    cyg_uint32 tmp;                     \
+    asm volatile (                      \
+        "mfmsr  %0;"                    \
+        "lis    %1,0;"                  \
+        "ori    %1,%1,0x8000;"          \
+        "and    %0,%0,%1;"              \
+        : "=&r"(_old_), "=r" (tmp));     \
+    CYG_MACRO_END
 
 //--------------------------------------------------------------------------
 // Vector translation.
@@ -345,18 +337,28 @@ externC void cyg_hal_default_exception_v
 // Clock control
 
 #define HAL_CLOCK_INITIALIZE( _period_ )        \
+    CYG_MACRO_START                             \
     asm volatile (                              \
         "mtdec %0;"                             \
         :                                       \
         : "r"(_period_)                         \
-        );
+        );                                      \
+    CYG_MACRO_END
 
 #define HAL_CLOCK_RESET( _vector_, _period_ )   \
+    CYG_MACRO_START                             \
+    cyg_uint32 tmp;                             \
     asm volatile (                              \
-        "mtdec %0;"                             \
-        :                                       \
+        "mfdec  %0;"                            \
+        "add.   %0,%0,%1;"                      \
+        "bgt    1f;"                            \
+        "mr     %0,%1;"                         \
+        "1: mtdec %0;"                          \
+        : "&=r" (tmp)                           \
         : "r"(_period_)                         \
-        );
+        : "cc"                                  \
+        );                                      \
+    CYG_MACRO_END
 
 #define HAL_CLOCK_READ( _pvalue_ )                              \
     CYG_MACRO_START                                             \