[PATCH 13/15] HiFive1: add interrupts enable/disable support
Gedare Bloom
gedare at rtems.org
Mon Aug 21 17:39:12 UTC 2017
On Mon, Aug 21, 2017 at 11:33 AM, Denis Obrezkov
<denisobrezkov at gmail.com> wrote:
> 2017-08-20 5:18 GMT+02:00 Hesham Almatary <heshamelmatary at gmail.com>:
>>
>> On Thu, Aug 17, 2017 at 1:13 AM, Denis Obrezkov <denisobrezkov at gmail.com>
>> wrote:
>> > ---
>> > cpukit/score/cpu/riscv32/rtems/score/cpu.h | 18 ++++++++++++------
>> > 1 file changed, 12 insertions(+), 6 deletions(-)
>> >
>> > diff --git a/cpukit/score/cpu/riscv32/rtems/score/cpu.h
>> > b/cpukit/score/cpu/riscv32/rtems/score/cpu.h
>> > index 8f8a864..9b484e6 100644
>> > --- a/cpukit/score/cpu/riscv32/rtems/score/cpu.h
>> > +++ b/cpukit/score/cpu/riscv32/rtems/score/cpu.h
>> > @@ -455,7 +455,7 @@ Context_Control_fp _CPU_Null_fp_context;
>> > *
>> > */
>> >
>> > -#define CPU_STACK_MINIMUM_SIZE 4096
>> > +#define CPU_STACK_MINIMUM_SIZE 700
>> >
>> > /*
>> > * CPU's worst alignment requirement for data types on a byte
>> > boundary. This
>> > @@ -538,7 +538,6 @@ Context_Control_fp _CPU_Null_fp_context;
>> > * level is returned in _level.
>> > *
>> > */
>> > -
>> > static inline uint32_t riscv_interrupt_disable( void )
>> > {
>> > register uint32_t sstatus;
>> > @@ -549,13 +548,15 @@ static inline uint32_t riscv_interrupt_disable(
>> > void )
>> > "csrw sstatus, %[temp]; \t"
>> > : [temp] "=r" (temp) : [sstatus] "r" (sstatus):
>> > );
>> > +#elif FE3XX
>> > + __asm__ volatile ("csrci mstatus, 0x8");
>> > + (void)temp;
>> Consider implementing this proprely as we discussed before. Also,
>> there's no need for the #elif FE3XX; just modify the #else below.
>> Enabling/disabling global interrupts in RISC-V (and this file) is
>> ISA/RISC-V specific, not BSP specific.
>>
>> > #else
>> > __asm__ __volatile__ ("csrr %[sstatus], mstatus; \t"
>> > "andi %[temp], %[sstatus], -2; \t"
>> > "csrw mstatus, %[temp]; \t"
>> > : [temp] "=r" (temp) : [sstatus] "r" (sstatus):
>> > );
>> > -
>> > #endif
>> > return sstatus;
>> > }
>> > @@ -565,15 +566,18 @@ static inline void riscv_interrupt_enable(uint32_t
>> > level)
>> > #ifdef SEL4
>> > __asm__ __volatile__ ("csrw sstatus, %[level];"
>> > :: [level] "r" (level):);
>> > +#elif FE3XX
>> > + __asm__ volatile ("csrsi mstatus, 0x8");
>> ditto
>> > #else
>> > __asm__ __volatile__ ("csrw mstatus, %[level];"
>> > :: [level] "r" (level):);
>> > -
>> > #endif
>> > }
>> >
>> > #define _CPU_ISR_Disable( _level ) \
>> > - _level = riscv_interrupt_disable()
>> > + do { \
>> > + _level = riscv_interrupt_disable();\
>> > + } while(0)
>> >
>> > /*
>> > * Enable interrupts to the previous level (returned by
>> > _CPU_ISR_Disable).
>> > @@ -583,7 +587,9 @@ static inline void riscv_interrupt_enable(uint32_t
>> > level)
>> > */
>> >
>> > #define _CPU_ISR_Enable( _level ) \
>> > - riscv_interrupt_enable( _level )
>> > + do {\
>> > + riscv_interrupt_enable( _level ); \
>> > + } while(0)
>> >
>> > /*
>> > * This temporarily restores the interrupt to _level before
>> > immediately
>> > --
>> > 2.1.4
>> >
>> > _______________________________________________
>> > devel mailing list
>> > devel at rtems.org
>> > http://lists.rtems.org/mailman/listinfo/devel
>>
>>
>>
>> --
>> Hesham
>
>
> As I answered you earlier I tried your solution and it just didn't work.
> I can try it again on the next iteration of the reviewing process, but as I
> said
> the _level value just isn't preserved between interrupts enabling/disabling.
>
Lack of variable preservation indicates a bug somewhere, probably
either in assembly code or (interrupt) context switching.
> --
> Regards, Denis Obrezkov
>
> _______________________________________________
> devel mailing list
> devel at rtems.org
> http://lists.rtems.org/mailman/listinfo/devel
More information about the devel
mailing list