mirror of
				https://github.com/openhwgroup/cvw
				synced 2025-02-11 06:05:49 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			53 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			53 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #pragma once
 | |
| 
 | |
| // The hart that non-SMP tests should run on
 | |
| #ifndef NONSMP_HART
 | |
| #define NONSMP_HART 0
 | |
| #endif
 | |
| 
 | |
| // The maximum number of HARTs this code supports
 | |
| #define CLINT_CTRL_ADDR 0x2000000
 | |
| #ifndef MAX_HARTS
 | |
| #define MAX_HARTS 256
 | |
| #endif
 | |
| #define CLINT_END_HART_IPI CLINT_CTRL_ADDR + (MAX_HARTS * 4)
 | |
| 
 | |
| /* If your test needs to temporarily block multiple-threads, do this:
 | |
|  *    smp_pause(reg1, reg2)
 | |
|  *    ... single-threaded work ...
 | |
|  *    smp_resume(reg1, reg2)
 | |
|  *    ... multi-threaded work ...
 | |
|  */
 | |
| 
 | |
| #define smp_pause(reg1, reg2) \
 | |
|     li reg2, 0x8;             \
 | |
|     csrw mie, reg2;           \
 | |
|     li reg1, NONSMP_HART;     \
 | |
|     csrr reg2, mhartid;       \
 | |
|     bne reg1, reg2, 42f
 | |
| 
 | |
| #define smp_resume(reg1, reg2)   \
 | |
|     li reg1, CLINT_CTRL_ADDR;    \
 | |
|     41:;                         \
 | |
|     li reg2, 1;                  \
 | |
|     sw reg2, 0(reg1);            \
 | |
|     addi reg1, reg1, 4;          \
 | |
|     li reg2, CLINT_END_HART_IPI; \
 | |
|     blt reg1, reg2, 41b;         \
 | |
|     42:;                         \
 | |
|     wfi;                         \
 | |
|     csrr reg2, mip;              \
 | |
|     andi reg2, reg2, 0x8;        \
 | |
|     beqz reg2, 42b;              \
 | |
|     li reg1, CLINT_CTRL_ADDR;    \
 | |
|     csrr reg2, mhartid;          \
 | |
|     slli reg2, reg2, 2;          \
 | |
|     add reg2, reg2, reg1;        \
 | |
|     sw zero, 0(reg2);            \
 | |
|     41:;                         \
 | |
|     lw reg2, 0(reg1);            \
 | |
|     bnez reg2, 41b;              \
 | |
|     addi reg1, reg1, 4;          \
 | |
|     li reg2, CLINT_END_HART_IPI; \
 | |
|     blt reg1, reg2, 41b
 |