forked from torvalds/linux
-
Notifications
You must be signed in to change notification settings - Fork 434
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
RISC-V: Generic library routines and assembly
This patch contains code that is more specific to the RISC-V ISA than it is to Linux. It contains string and math operations, C wrappers for various assembly instructions, stack walking code, and uaccess. Signed-off-by: Palmer Dabbelt <[email protected]>
- Loading branch information
1 parent
fab957c
commit 5d8544e
Showing
11 changed files
with
1,389 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,76 @@ | ||
/* | ||
* Copyright (C) 2015 Regents of the University of California | ||
* | ||
* This program is free software; you can redistribute it and/or | ||
* modify it under the terms of the GNU General Public License | ||
* as published by the Free Software Foundation, version 2. | ||
* | ||
* This program is distributed in the hope that it will be useful, | ||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
* GNU General Public License for more details. | ||
*/ | ||
|
||
#ifndef _ASM_RISCV_ASM_H | ||
#define _ASM_RISCV_ASM_H | ||
|
||
#ifdef __ASSEMBLY__ | ||
#define __ASM_STR(x) x | ||
#else | ||
#define __ASM_STR(x) #x | ||
#endif | ||
|
||
#if __riscv_xlen == 64 | ||
#define __REG_SEL(a, b) __ASM_STR(a) | ||
#elif __riscv_xlen == 32 | ||
#define __REG_SEL(a, b) __ASM_STR(b) | ||
#else | ||
#error "Unexpected __riscv_xlen" | ||
#endif | ||
|
||
#define REG_L __REG_SEL(ld, lw) | ||
#define REG_S __REG_SEL(sd, sw) | ||
#define SZREG __REG_SEL(8, 4) | ||
#define LGREG __REG_SEL(3, 2) | ||
|
||
#if __SIZEOF_POINTER__ == 8 | ||
#ifdef __ASSEMBLY__ | ||
#define RISCV_PTR .dword | ||
#define RISCV_SZPTR 8 | ||
#define RISCV_LGPTR 3 | ||
#else | ||
#define RISCV_PTR ".dword" | ||
#define RISCV_SZPTR "8" | ||
#define RISCV_LGPTR "3" | ||
#endif | ||
#elif __SIZEOF_POINTER__ == 4 | ||
#ifdef __ASSEMBLY__ | ||
#define RISCV_PTR .word | ||
#define RISCV_SZPTR 4 | ||
#define RISCV_LGPTR 2 | ||
#else | ||
#define RISCV_PTR ".word" | ||
#define RISCV_SZPTR "4" | ||
#define RISCV_LGPTR "2" | ||
#endif | ||
#else | ||
#error "Unexpected __SIZEOF_POINTER__" | ||
#endif | ||
|
||
#if (__SIZEOF_INT__ == 4) | ||
#define INT __ASM_STR(.word) | ||
#define SZINT __ASM_STR(4) | ||
#define LGINT __ASM_STR(2) | ||
#else | ||
#error "Unexpected __SIZEOF_INT__" | ||
#endif | ||
|
||
#if (__SIZEOF_SHORT__ == 2) | ||
#define SHORT __ASM_STR(.half) | ||
#define SZSHORT __ASM_STR(2) | ||
#define LGSHORT __ASM_STR(1) | ||
#else | ||
#error "Unexpected __SIZEOF_SHORT__" | ||
#endif | ||
|
||
#endif /* _ASM_RISCV_ASM_H */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,132 @@ | ||
/* | ||
* Copyright (C) 2015 Regents of the University of California | ||
* | ||
* This program is free software; you can redistribute it and/or | ||
* modify it under the terms of the GNU General Public License | ||
* as published by the Free Software Foundation, version 2. | ||
* | ||
* This program is distributed in the hope that it will be useful, | ||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
* GNU General Public License for more details. | ||
*/ | ||
|
||
#ifndef _ASM_RISCV_CSR_H | ||
#define _ASM_RISCV_CSR_H | ||
|
||
#include <linux/const.h> | ||
|
||
/* Status register flags */ | ||
#define SR_IE _AC(0x00000002, UL) /* Interrupt Enable */ | ||
#define SR_PIE _AC(0x00000020, UL) /* Previous IE */ | ||
#define SR_PS _AC(0x00000100, UL) /* Previously Supervisor */ | ||
#define SR_SUM _AC(0x00040000, UL) /* Supervisor may access User Memory */ | ||
|
||
#define SR_FS _AC(0x00006000, UL) /* Floating-point Status */ | ||
#define SR_FS_OFF _AC(0x00000000, UL) | ||
#define SR_FS_INITIAL _AC(0x00002000, UL) | ||
#define SR_FS_CLEAN _AC(0x00004000, UL) | ||
#define SR_FS_DIRTY _AC(0x00006000, UL) | ||
|
||
#define SR_XS _AC(0x00018000, UL) /* Extension Status */ | ||
#define SR_XS_OFF _AC(0x00000000, UL) | ||
#define SR_XS_INITIAL _AC(0x00008000, UL) | ||
#define SR_XS_CLEAN _AC(0x00010000, UL) | ||
#define SR_XS_DIRTY _AC(0x00018000, UL) | ||
|
||
#ifndef CONFIG_64BIT | ||
#define SR_SD _AC(0x80000000, UL) /* FS/XS dirty */ | ||
#else | ||
#define SR_SD _AC(0x8000000000000000, UL) /* FS/XS dirty */ | ||
#endif | ||
|
||
/* SPTBR flags */ | ||
#if __riscv_xlen == 32 | ||
#define SPTBR_PPN _AC(0x003FFFFF, UL) | ||
#define SPTBR_MODE_32 _AC(0x80000000, UL) | ||
#define SPTBR_MODE SPTBR_MODE_32 | ||
#else | ||
#define SPTBR_PPN _AC(0x00000FFFFFFFFFFF, UL) | ||
#define SPTBR_MODE_39 _AC(0x8000000000000000, UL) | ||
#define SPTBR_MODE SPTBR_MODE_39 | ||
#endif | ||
|
||
/* Interrupt Enable and Interrupt Pending flags */ | ||
#define SIE_SSIE _AC(0x00000002, UL) /* Software Interrupt Enable */ | ||
#define SIE_STIE _AC(0x00000020, UL) /* Timer Interrupt Enable */ | ||
|
||
#define EXC_INST_MISALIGNED 0 | ||
#define EXC_INST_ACCESS 1 | ||
#define EXC_BREAKPOINT 3 | ||
#define EXC_LOAD_ACCESS 5 | ||
#define EXC_STORE_ACCESS 7 | ||
#define EXC_SYSCALL 8 | ||
#define EXC_INST_PAGE_FAULT 12 | ||
#define EXC_LOAD_PAGE_FAULT 13 | ||
#define EXC_STORE_PAGE_FAULT 15 | ||
|
||
#ifndef __ASSEMBLY__ | ||
|
||
#define csr_swap(csr, val) \ | ||
({ \ | ||
unsigned long __v = (unsigned long)(val); \ | ||
__asm__ __volatile__ ("csrrw %0, " #csr ", %1" \ | ||
: "=r" (__v) : "rK" (__v) \ | ||
: "memory"); \ | ||
__v; \ | ||
}) | ||
|
||
#define csr_read(csr) \ | ||
({ \ | ||
register unsigned long __v; \ | ||
__asm__ __volatile__ ("csrr %0, " #csr \ | ||
: "=r" (__v) : \ | ||
: "memory"); \ | ||
__v; \ | ||
}) | ||
|
||
#define csr_write(csr, val) \ | ||
({ \ | ||
unsigned long __v = (unsigned long)(val); \ | ||
__asm__ __volatile__ ("csrw " #csr ", %0" \ | ||
: : "rK" (__v) \ | ||
: "memory"); \ | ||
}) | ||
|
||
#define csr_read_set(csr, val) \ | ||
({ \ | ||
unsigned long __v = (unsigned long)(val); \ | ||
__asm__ __volatile__ ("csrrs %0, " #csr ", %1" \ | ||
: "=r" (__v) : "rK" (__v) \ | ||
: "memory"); \ | ||
__v; \ | ||
}) | ||
|
||
#define csr_set(csr, val) \ | ||
({ \ | ||
unsigned long __v = (unsigned long)(val); \ | ||
__asm__ __volatile__ ("csrs " #csr ", %0" \ | ||
: : "rK" (__v) \ | ||
: "memory"); \ | ||
}) | ||
|
||
#define csr_read_clear(csr, val) \ | ||
({ \ | ||
unsigned long __v = (unsigned long)(val); \ | ||
__asm__ __volatile__ ("csrrc %0, " #csr ", %1" \ | ||
: "=r" (__v) : "rK" (__v) \ | ||
: "memory"); \ | ||
__v; \ | ||
}) | ||
|
||
#define csr_clear(csr, val) \ | ||
({ \ | ||
unsigned long __v = (unsigned long)(val); \ | ||
__asm__ __volatile__ ("csrc " #csr ", %0" \ | ||
: : "rK" (__v) \ | ||
: "memory"); \ | ||
}) | ||
|
||
#endif /* __ASSEMBLY__ */ | ||
|
||
#endif /* _ASM_RISCV_CSR_H */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
/* | ||
* Copyright (C) 2015 Regents of the University of California | ||
* | ||
* This program is free software; you can redistribute it and/or | ||
* modify it under the terms of the GNU General Public License | ||
* as published by the Free Software Foundation, version 2. | ||
* | ||
* This program is distributed in the hope that it will be useful, | ||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
* GNU General Public License for more details. | ||
*/ | ||
|
||
#ifndef _ASM_RISCV_LINKAGE_H | ||
#define _ASM_RISCV_LINKAGE_H | ||
|
||
#define __ALIGN .balign 4 | ||
#define __ALIGN_STR ".balign 4" | ||
|
||
#endif /* _ASM_RISCV_LINKAGE_H */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
/* | ||
* Copyright (C) 2013 Regents of the University of California | ||
* | ||
* This program is free software; you can redistribute it and/or | ||
* modify it under the terms of the GNU General Public License | ||
* as published by the Free Software Foundation, version 2. | ||
* | ||
* This program is distributed in the hope that it will be useful, | ||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
* GNU General Public License for more details. | ||
*/ | ||
|
||
#ifndef _ASM_RISCV_STRING_H | ||
#define _ASM_RISCV_STRING_H | ||
|
||
#include <linux/types.h> | ||
#include <linux/linkage.h> | ||
|
||
#define __HAVE_ARCH_MEMSET | ||
extern asmlinkage void *memset(void *, int, size_t); | ||
|
||
#define __HAVE_ARCH_MEMCPY | ||
extern asmlinkage void *memcpy(void *, const void *, size_t); | ||
|
||
#endif /* _ASM_RISCV_STRING_H */ |
Oops, something went wrong.