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
 |