riscv: Add indirect stringification to csr_xxx ops
With current csr_xxx ops, we cannot pass a macro to parameter 'csr', hence we need add another level to allow the parameter to be a macro itself, aka indirect stringification. Signed-off-by: Bin Meng <bmeng.cn@gmail.com> Reviewed-by: Lukas Auer <lukas.auer@aisec.fraunhofer.de> Reviewed-by: Anup Patel <anup@brainfault.org>
This commit is contained in:
		
							parent
							
								
									aef59e5cc4
								
							
						
					
					
						commit
						57fe5c64cb
					
				|  | @ -61,10 +61,12 @@ | ||||||
| 
 | 
 | ||||||
| #ifndef __ASSEMBLY__ | #ifndef __ASSEMBLY__ | ||||||
| 
 | 
 | ||||||
|  | #define xcsr(csr)	#csr | ||||||
|  | 
 | ||||||
| #define csr_swap(csr, val)					\ | #define csr_swap(csr, val)					\ | ||||||
| ({								\ | ({								\ | ||||||
| 	unsigned long __v = (unsigned long)(val);		\ | 	unsigned long __v = (unsigned long)(val);		\ | ||||||
| 	__asm__ __volatile__ ("csrrw %0, " #csr ", %1"		\ | 	__asm__ __volatile__ ("csrrw %0, " xcsr(csr) ", %1"	\ | ||||||
| 			      : "=r" (__v) : "rK" (__v)		\ | 			      : "=r" (__v) : "rK" (__v)		\ | ||||||
| 			      : "memory");			\ | 			      : "memory");			\ | ||||||
| 	__v;							\ | 	__v;							\ | ||||||
|  | @ -73,7 +75,7 @@ | ||||||
| #define csr_read(csr)						\ | #define csr_read(csr)						\ | ||||||
| ({								\ | ({								\ | ||||||
| 	register unsigned long __v;				\ | 	register unsigned long __v;				\ | ||||||
| 	__asm__ __volatile__ ("csrr %0, " #csr			\ | 	__asm__ __volatile__ ("csrr %0, " xcsr(csr)		\ | ||||||
| 			      : "=r" (__v) :			\ | 			      : "=r" (__v) :			\ | ||||||
| 			      : "memory");			\ | 			      : "memory");			\ | ||||||
| 	__v;							\ | 	__v;							\ | ||||||
|  | @ -82,7 +84,7 @@ | ||||||
| #define csr_write(csr, val)					\ | #define csr_write(csr, val)					\ | ||||||
| ({								\ | ({								\ | ||||||
| 	unsigned long __v = (unsigned long)(val);		\ | 	unsigned long __v = (unsigned long)(val);		\ | ||||||
| 	__asm__ __volatile__ ("csrw " #csr ", %0"		\ | 	__asm__ __volatile__ ("csrw " xcsr(csr) ", %0"		\ | ||||||
| 			      : : "rK" (__v)			\ | 			      : : "rK" (__v)			\ | ||||||
| 			      : "memory");			\ | 			      : "memory");			\ | ||||||
| }) | }) | ||||||
|  | @ -90,7 +92,7 @@ | ||||||
| #define csr_read_set(csr, val)					\ | #define csr_read_set(csr, val)					\ | ||||||
| ({								\ | ({								\ | ||||||
| 	unsigned long __v = (unsigned long)(val);		\ | 	unsigned long __v = (unsigned long)(val);		\ | ||||||
| 	__asm__ __volatile__ ("csrrs %0, " #csr ", %1"		\ | 	__asm__ __volatile__ ("csrrs %0, " xcsr(csr) ", %1"	\ | ||||||
| 			      : "=r" (__v) : "rK" (__v)		\ | 			      : "=r" (__v) : "rK" (__v)		\ | ||||||
| 			      : "memory");			\ | 			      : "memory");			\ | ||||||
| 	__v;							\ | 	__v;							\ | ||||||
|  | @ -99,7 +101,7 @@ | ||||||
| #define csr_set(csr, val)					\ | #define csr_set(csr, val)					\ | ||||||
| ({								\ | ({								\ | ||||||
| 	unsigned long __v = (unsigned long)(val);		\ | 	unsigned long __v = (unsigned long)(val);		\ | ||||||
| 	__asm__ __volatile__ ("csrs " #csr ", %0"		\ | 	__asm__ __volatile__ ("csrs " xcsr(csr) ", %0"		\ | ||||||
| 			      : : "rK" (__v)			\ | 			      : : "rK" (__v)			\ | ||||||
| 			      : "memory");			\ | 			      : "memory");			\ | ||||||
| }) | }) | ||||||
|  | @ -107,7 +109,7 @@ | ||||||
| #define csr_read_clear(csr, val)				\ | #define csr_read_clear(csr, val)				\ | ||||||
| ({								\ | ({								\ | ||||||
| 	unsigned long __v = (unsigned long)(val);		\ | 	unsigned long __v = (unsigned long)(val);		\ | ||||||
| 	__asm__ __volatile__ ("csrrc %0, " #csr ", %1"		\ | 	__asm__ __volatile__ ("csrrc %0, " xcsr(csr) ", %1"	\ | ||||||
| 			      : "=r" (__v) : "rK" (__v)		\ | 			      : "=r" (__v) : "rK" (__v)		\ | ||||||
| 			      : "memory");			\ | 			      : "memory");			\ | ||||||
| 	__v;							\ | 	__v;							\ | ||||||
|  | @ -116,7 +118,7 @@ | ||||||
| #define csr_clear(csr, val)					\ | #define csr_clear(csr, val)					\ | ||||||
| ({								\ | ({								\ | ||||||
| 	unsigned long __v = (unsigned long)(val);		\ | 	unsigned long __v = (unsigned long)(val);		\ | ||||||
| 	__asm__ __volatile__ ("csrc " #csr ", %0"		\ | 	__asm__ __volatile__ ("csrc " xcsr(csr) ", %0"		\ | ||||||
| 			      : : "rK" (__v)			\ | 			      : : "rK" (__v)			\ | ||||||
| 			      : "memory");			\ | 			      : "memory");			\ | ||||||
| }) | }) | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue