Changeset fb31e1a2 in rtems


Ignore:
Timestamp:
Jul 17, 2000, 1:01:44 PM (20 years ago)
Author:
Joel Sherrill <joel.sherrill@…>
Branches:
4.10, 4.11, 4.8, 4.9, 5, master
Children:
09f52f0
Parents:
237c259
Message:

Update from Philip Quaife <rtemsdev@…> that was hand-merged.
This update addresses the following:

+ the ISR enable/disable/flash macros now work with old gcc versions.
+ the UI CCR bits are now masked since other example code did so
+ _ISR_Dispatch disables interrupts during call setup

Together these removed the instabilities he was seeing.

Files:
4 edited

Legend:

Unmodified
Added
Removed
  • c/src/exec/score/cpu/h8300/cpu_asm.S

    r237c259 rfb31e1a2  
    1919;.equ   HEIRCONTEXT_ARG, er1
    2020       
    21 
    22 /*
     21/*     
    2322 *  Make sure we tell the assembler what type of CPU model we are
    2423 *  being compiled for.
    25  */
     24 */ 
    2625
    2726#if defined(__H8300H__)
    28         .h8300h
     27        .h8300h
    2928#endif
    30 #if defined(__H8300S__)
    31         .h8300s
     29#if defined(__H8300S__) 
     30        .h8300s
    3231#endif
     32        .text
     33
    3334        .text
    34 
    3535/*
    3636        GCC Compiled with optimisations and Wimplicit decs to ensure
     
    4444
    4545        .align 2
     46
    4647        .global __CPU_Context_switch
     48
    4749__CPU_Context_switch:
    48 #if defined(__H8300H__) || defined(__H8300S__)
    4950        /* Save Context */
    50         stc     ccr,@(0:16,er0)
     51        stc.w   ccr,@(0:16,er0)
    5152        mov.l   er7,@(2:16,er0)
    5253        mov.l   er6,@(6:16,er0)
     
    6566        mov.l   @(6:16,er1),er6
    6667        mov.l   @(2:16,er1),er7
    67         ldc     @(0:16,er1),ccr
    68 #endif
     68        ldc.w   @(0:16,er1),ccr
     69
    6970        rts
    7071
    7172        .align 2
     73
    7274        .global __CPU_Context_restore
     75
    7376__CPU_Context_restore:
    74 #if defined(__H8300H__) || defined(__H8300S__)
    75         mov.l   er0,er1
    76         jmp     @restore:24
    77 #else
    78         rts
    79 #endif
     77       
     78        Mov.l   er0,er1
     79        jmp             @restore:24
    8080
    8181
     
    9797       
    9898__ISR_Handler:
    99 #if defined(__H8300H__) || defined(__H8300S__)
    10099        mov.l   er1,@-er7
    101100        mov.l   er2,@-er7
     
    106105       
    107106/*  Set IRQ Stack */
    108         orc             #0x80,ccr
     107        orc             #0xc0,ccr
    109108        mov.l   er7,er6         ; save stack pointer
    110109        mov.l   @__ISR_Nest_level,er1
     
    133132        jsr             @er1    ; er0 = arg1 =vector
    134133       
    135         orc             #0x80,ccr
     134        orc             #0xc0,ccr
    136135        mov.l   @__ISR_Nest_level,er1
    137136        dec.l   #1,er1
     
    151150       
    152151bframe:
    153         orc             #0x80,ccr
     152        orc             #0xc0,ccr
    154153/*      Pop Stack       */
    155154        mov             @er7+,er6
     
    160159        /* Set up IRQ stack frame and dispatch to _ISR_Dispatch */
    161160       
    162         stc             ccr,@er2
    163         and.l   #0xff,er2       
    164         rotr.l  er2
    165         rotr.l  er2
    166         rotr.l  er2
    167         rotr.l  er2
     161        mov.l   #0xc0000000,er2         /* Disable IRQ */
    168162        or.l    #_ISR_Dispatch,er2
    169163        mov.l   er2,@-er7
     
    176170        mov             @er7+,er6
    177171        mov             er6,er7
    178         andc    #0x7f,ccr
    179         mov             @er7+,er6
    180         mov             @er7+,er5
    181         mov             @er7+,er4
    182         mov             @er7+,er3
    183         mov             @er7+,er2
    184         mov             @er7+,er1
    185         mov             @er7+,er0
    186         andc    #0x7f,ccr
    187         rte
    188 #endif
    189        
    190 /*
    191         Called from ISR_Handler as a way of ending IRQ
    192         but allowing dispatch to another task.
    193         Must use RTE as CCR is still on stack but IRQ has been serviced.       
    194         CCR and PC occupy same word so rte can be used.
    195 */
    196 
    197         .align 2
    198         .global _ISR_Dispatch
    199 
    200 _ISR_Dispatch:
    201 #if defined(__H8300H__) || defined(__H8300S__)
    202         jsr             @__Thread_Dispatch
    203172        mov             @er7+,er6
    204173        mov             @er7+,er5
     
    209178        mov             @er7+,er0
    210179        rte
    211 #endif
     180       
     181/*
     182        Called from ISR_Handler as a way of ending IRQ
     183        but allowing dispatch to another task.
     184        Must use RTE as CCR is still on stack but IRQ has been serviced.       
     185        CCR and PC occupy same word so rte can be used.
     186        now using task stack
     187*/
     188
     189        .align 2
     190        .global _ISR_Dispatch
     191
     192_ISR_Dispatch:
     193       
     194        Jsr             @__Thread_Dispatch
     195        mov             @er7+,er6
     196        mov             @er7+,er5
     197        mov             @er7+,er4
     198        mov             @er7+,er3
     199        mov             @er7+,er2
     200        mov             @er7+,er1
     201        mov             @er7+,er0
     202        rte
    212203       
    213204
  • c/src/exec/score/cpu/h8300/rtems/score/cpu.h

    r237c259 rfb31e1a2  
    604604/* ISR handler macros */
    605605
     606/* COPE With Brain dead version of GCC distributed with Hitachi HIView Tools.
     607   Note requires ISR_Level be unsigned16 or assembler croaks.
     608*/
     609
     610#if (__GNUC__ == 2 && __GNUC_MINOR__ == 7 )
     611
     612
    606613/*
    607614 *  Disable all interrupts for an RTEMS critical section.  The previous
    608615 *  level is returned in _level.
    609  *
    610  *  H8300 Specific Information:
    611  *
    612  *  XXX  FIXME this does not nest properly for the H8300.
     616 */
     617
     618#define _CPU_ISR_Disable( _isr_cookie ) \
     619  do { \
     620    asm volatile( "stc.w ccr, @-er7 ;\n orc #0xC0,ccr ;\n mov.w @er7+,%0" :  : "r" (_isr_cookie) ); \
     621  } while (0)
     622
     623
     624/*
     625 *  Enable interrupts to the previois level (returned by _CPU_ISR_Disable).
     626 *  This indicates the end of an RTEMS critical section.  The parameter
     627 *  _level is not modified.
     628 */
     629
     630
     631#define _CPU_ISR_Enable( _isr_cookie )  \
     632  do { \
     633    asm volatile( "mov.w %0,@-er7 ;\n ldc.w @er7+, ccr" :  : "r" (_isr_cookie) ); \
     634  } while (0)
     635
     636
     637/*
     638 *  This temporarily restores the interrupt to _level before immediately
     639 *  disabling them again.  This is used to divide long RTEMS critical
     640 *  sections into two or more parts.  The parameter _level is not
     641 * modified.
     642 */
     643
     644
     645#define _CPU_ISR_Flash( _isr_cookie ) \
     646  do { \
     647    asm volatile( "mov.w %0,@-er7 ;\n ldc.w @er7+, ccr ;\n orc #0xC0,ccr" :  : "r" (_isr_cookie) ); \
     648  } while (0)
     649
     650/* end of ISR handler macros */
     651
     652#else
     653
     654/*
     655 *  Disable all interrupts for an RTEMS critical section.  The previous
     656 *  level is returned in _level.
     657 *
     658 *  H8300 Specific Information:
     659 *
     660 *  XXX 
    613661 */
    614662
     
    669717  } while (0)
    670718#endif
     719
     720#endif /* end of old gcc */
    671721
    672722
  • cpukit/score/cpu/h8300/cpu_asm.S

    r237c259 rfb31e1a2  
    1919;.equ   HEIRCONTEXT_ARG, er1
    2020       
    21 
    22 /*
     21/*     
    2322 *  Make sure we tell the assembler what type of CPU model we are
    2423 *  being compiled for.
    25  */
     24 */ 
    2625
    2726#if defined(__H8300H__)
    28         .h8300h
     27        .h8300h
    2928#endif
    30 #if defined(__H8300S__)
    31         .h8300s
     29#if defined(__H8300S__) 
     30        .h8300s
    3231#endif
     32        .text
     33
    3334        .text
    34 
    3535/*
    3636        GCC Compiled with optimisations and Wimplicit decs to ensure
     
    4444
    4545        .align 2
     46
    4647        .global __CPU_Context_switch
     48
    4749__CPU_Context_switch:
    48 #if defined(__H8300H__) || defined(__H8300S__)
    4950        /* Save Context */
    50         stc     ccr,@(0:16,er0)
     51        stc.w   ccr,@(0:16,er0)
    5152        mov.l   er7,@(2:16,er0)
    5253        mov.l   er6,@(6:16,er0)
     
    6566        mov.l   @(6:16,er1),er6
    6667        mov.l   @(2:16,er1),er7
    67         ldc     @(0:16,er1),ccr
    68 #endif
     68        ldc.w   @(0:16,er1),ccr
     69
    6970        rts
    7071
    7172        .align 2
     73
    7274        .global __CPU_Context_restore
     75
    7376__CPU_Context_restore:
    74 #if defined(__H8300H__) || defined(__H8300S__)
    75         mov.l   er0,er1
    76         jmp     @restore:24
    77 #else
    78         rts
    79 #endif
     77       
     78        Mov.l   er0,er1
     79        jmp             @restore:24
    8080
    8181
     
    9797       
    9898__ISR_Handler:
    99 #if defined(__H8300H__) || defined(__H8300S__)
    10099        mov.l   er1,@-er7
    101100        mov.l   er2,@-er7
     
    106105       
    107106/*  Set IRQ Stack */
    108         orc             #0x80,ccr
     107        orc             #0xc0,ccr
    109108        mov.l   er7,er6         ; save stack pointer
    110109        mov.l   @__ISR_Nest_level,er1
     
    133132        jsr             @er1    ; er0 = arg1 =vector
    134133       
    135         orc             #0x80,ccr
     134        orc             #0xc0,ccr
    136135        mov.l   @__ISR_Nest_level,er1
    137136        dec.l   #1,er1
     
    151150       
    152151bframe:
    153         orc             #0x80,ccr
     152        orc             #0xc0,ccr
    154153/*      Pop Stack       */
    155154        mov             @er7+,er6
     
    160159        /* Set up IRQ stack frame and dispatch to _ISR_Dispatch */
    161160       
    162         stc             ccr,@er2
    163         and.l   #0xff,er2       
    164         rotr.l  er2
    165         rotr.l  er2
    166         rotr.l  er2
    167         rotr.l  er2
     161        mov.l   #0xc0000000,er2         /* Disable IRQ */
    168162        or.l    #_ISR_Dispatch,er2
    169163        mov.l   er2,@-er7
     
    176170        mov             @er7+,er6
    177171        mov             er6,er7
    178         andc    #0x7f,ccr
    179         mov             @er7+,er6
    180         mov             @er7+,er5
    181         mov             @er7+,er4
    182         mov             @er7+,er3
    183         mov             @er7+,er2
    184         mov             @er7+,er1
    185         mov             @er7+,er0
    186         andc    #0x7f,ccr
    187         rte
    188 #endif
    189        
    190 /*
    191         Called from ISR_Handler as a way of ending IRQ
    192         but allowing dispatch to another task.
    193         Must use RTE as CCR is still on stack but IRQ has been serviced.       
    194         CCR and PC occupy same word so rte can be used.
    195 */
    196 
    197         .align 2
    198         .global _ISR_Dispatch
    199 
    200 _ISR_Dispatch:
    201 #if defined(__H8300H__) || defined(__H8300S__)
    202         jsr             @__Thread_Dispatch
    203172        mov             @er7+,er6
    204173        mov             @er7+,er5
     
    209178        mov             @er7+,er0
    210179        rte
    211 #endif
     180       
     181/*
     182        Called from ISR_Handler as a way of ending IRQ
     183        but allowing dispatch to another task.
     184        Must use RTE as CCR is still on stack but IRQ has been serviced.       
     185        CCR and PC occupy same word so rte can be used.
     186        now using task stack
     187*/
     188
     189        .align 2
     190        .global _ISR_Dispatch
     191
     192_ISR_Dispatch:
     193       
     194        Jsr             @__Thread_Dispatch
     195        mov             @er7+,er6
     196        mov             @er7+,er5
     197        mov             @er7+,er4
     198        mov             @er7+,er3
     199        mov             @er7+,er2
     200        mov             @er7+,er1
     201        mov             @er7+,er0
     202        rte
    212203       
    213204
  • cpukit/score/cpu/h8300/rtems/score/cpu.h

    r237c259 rfb31e1a2  
    604604/* ISR handler macros */
    605605
     606/* COPE With Brain dead version of GCC distributed with Hitachi HIView Tools.
     607   Note requires ISR_Level be unsigned16 or assembler croaks.
     608*/
     609
     610#if (__GNUC__ == 2 && __GNUC_MINOR__ == 7 )
     611
     612
    606613/*
    607614 *  Disable all interrupts for an RTEMS critical section.  The previous
    608615 *  level is returned in _level.
    609  *
    610  *  H8300 Specific Information:
    611  *
    612  *  XXX  FIXME this does not nest properly for the H8300.
     616 */
     617
     618#define _CPU_ISR_Disable( _isr_cookie ) \
     619  do { \
     620    asm volatile( "stc.w ccr, @-er7 ;\n orc #0xC0,ccr ;\n mov.w @er7+,%0" :  : "r" (_isr_cookie) ); \
     621  } while (0)
     622
     623
     624/*
     625 *  Enable interrupts to the previois level (returned by _CPU_ISR_Disable).
     626 *  This indicates the end of an RTEMS critical section.  The parameter
     627 *  _level is not modified.
     628 */
     629
     630
     631#define _CPU_ISR_Enable( _isr_cookie )  \
     632  do { \
     633    asm volatile( "mov.w %0,@-er7 ;\n ldc.w @er7+, ccr" :  : "r" (_isr_cookie) ); \
     634  } while (0)
     635
     636
     637/*
     638 *  This temporarily restores the interrupt to _level before immediately
     639 *  disabling them again.  This is used to divide long RTEMS critical
     640 *  sections into two or more parts.  The parameter _level is not
     641 * modified.
     642 */
     643
     644
     645#define _CPU_ISR_Flash( _isr_cookie ) \
     646  do { \
     647    asm volatile( "mov.w %0,@-er7 ;\n ldc.w @er7+, ccr ;\n orc #0xC0,ccr" :  : "r" (_isr_cookie) ); \
     648  } while (0)
     649
     650/* end of ISR handler macros */
     651
     652#else
     653
     654/*
     655 *  Disable all interrupts for an RTEMS critical section.  The previous
     656 *  level is returned in _level.
     657 *
     658 *  H8300 Specific Information:
     659 *
     660 *  XXX 
    613661 */
    614662
     
    669717  } while (0)
    670718#endif
     719
     720#endif /* end of old gcc */
    671721
    672722
Note: See TracChangeset for help on using the changeset viewer.