arch/riscv: Update encoding.h and dependent files

I copied it from commit e10d2def7d of spike and made sure the copyright
header is still there.

Change-Id: Ie8b56cd2f4855b97d36a112a195866f4ff0feec5
Signed-off-by: Jonathan Neuschäfer <j.neuschaefer@gmx.net>
Reviewed-on: https://review.coreboot.org/15832
Tested-by: build bot (Jenkins)
Reviewed-by: Stefan Reinauer <stefan.reinauer@coreboot.org>
This commit is contained in:
Jonathan Neuschäfer 2016-08-09 02:07:10 +02:00 committed by Ronald G. Minnich
parent 6e1884ff5d
commit c42b5917af
3 changed files with 859 additions and 776 deletions

File diff suppressed because it is too large Load Diff

View File

@ -30,8 +30,8 @@
#include <arch/encoding.h>
#define disable_irqsave() clear_csr(sstatus, SSTATUS_IE)
#define enable_irqrestore(flags) set_csr(sstatus, (flags) & SSTATUS_IE)
#define disable_irqsave() clear_csr(mstatus, MSTATUS_MIE)
#define enable_irqrestore(flags) set_csr(mstatus, (flags) & MSTATUS_MIE)
typedef struct { int lock; } spinlock_t;
#define SPINLOCK_INIT {0}

View File

@ -42,15 +42,18 @@ size_t pte_ppn(pte_t pte)
pte_t ptd_create(uintptr_t ppn)
{
return (ppn << PTE_PPN_SHIFT) | PTE_V | PTE_TYPE_TABLE;
return (ppn << PTE_PPN_SHIFT) | PTE_V;
}
pte_t pte_create(uintptr_t ppn, int prot, int user)
{
pte_t pte = (ppn << PTE_PPN_SHIFT) | PTE_V;
if (prot & PROT_WRITE) pte |= PTE_TYPE_URW_SRW;
if (prot & PROT_EXEC) pte |= PTE_TYPE_URX_SRX;
if (!user) pte |= PTE_TYPE_SR;
pte_t pte = (ppn << PTE_PPN_SHIFT) | PTE_R | PTE_V;
if (prot & PROT_WRITE)
pte |= PTE_W;
if (prot & PROT_EXEC)
pte |= PTE_X;
if (user)
pte |= PTE_U;
return pte;
}
@ -127,10 +130,6 @@ void mstatus_init(void)
// supervisor support is required
uintptr_t ms = 0;
ms = INSERT_FIELD(ms, MSTATUS_PRV, PRV_M);
ms = INSERT_FIELD(ms, MSTATUS_PRV1, PRV_S);
ms = INSERT_FIELD(ms, MSTATUS_PRV2, PRV_U);
ms = INSERT_FIELD(ms, MSTATUS_IE2, 1);
ms = INSERT_FIELD(ms, MSTATUS_FS, 3);
ms = INSERT_FIELD(ms, MSTATUS_XS, 3);
write_csr(mstatus, ms);