Fork us on GitHub Follow us on Facebook Follow us on Twitter

Changeset c16479e in mainline


Ignore:
Timestamp:
2017-08-21T18:42:28Z (3 years ago)
Author:
Martin Decky <martin@…>
Branches:
master
Children:
ccc362a1
Parents:
5f2926a
Message:

riscv64: interrupt management routines

File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/arch/riscv64/include/arch/asm.h

    r5f2926a rc16479e  
    4141#include <trace.h>
    4242
     43#define SSTATUS_SIE_MASK  0x00000002
     44
    4345NO_TRACE static inline ipl_t interrupts_enable(void)
    4446{
    45         // FIXME
    46         return 0;
     47        ipl_t ipl;
     48       
     49        asm volatile (
     50                "csrrsi %[ipl], sstatus, " STRING(SSTATUS_SIE_MASK) "\n"
     51                : [ipl] "=r" (ipl)
     52        );
     53       
     54        return ipl;
    4755}
    4856
    4957NO_TRACE static inline ipl_t interrupts_disable(void)
    5058{
    51         // FIXME
    52         return 0;
     59        ipl_t ipl;
     60       
     61        asm volatile (
     62                "csrrci %[ipl], sstatus, " STRING(SSTATUS_SIE_MASK) "\n"
     63                : [ipl] "=r" (ipl)
     64        );
     65       
     66        return ipl;
    5367}
    5468
    5569NO_TRACE static inline void interrupts_restore(ipl_t ipl)
    5670{
    57         // FIXME
     71        if ((ipl & SSTATUS_SIE_MASK) == SSTATUS_SIE_MASK)
     72                interrupts_enable();
     73        else
     74                interrupts_disable();
    5875}
    5976
    6077NO_TRACE static inline ipl_t interrupts_read(void)
    6178{
    62         // FIXME
    63         return 0;
     79        ipl_t ipl;
     80       
     81        asm volatile (
     82                "csrr %[ipl], sstatus\n"
     83                : [ipl] "=r" (ipl)
     84        );
     85       
     86        return ipl;
    6487}
    6588
    6689NO_TRACE static inline bool interrupts_disabled(void)
    6790{
    68         // FIXME
    69         return 0;
     91        return ((interrupts_read() & SSTATUS_SIE_MASK) == 0);
    7092}
    7193
    7294NO_TRACE static inline uintptr_t get_stack_base(void)
    7395{
    74         // FIXME
    75         return 0;
     96        uintptr_t base;
     97       
     98        asm volatile (
     99                "and %[base], sp, %[mask]\n"
     100                : [base] "=r" (base)
     101                : [mask] "r" (~(STACK_SIZE - 1))
     102        );
     103       
     104        return base;
    76105}
    77106
Note: See TracChangeset for help on using the changeset viewer.