|
| 1 | +#ifndef QUICKTHREADS_RISCV64_H |
| 2 | +#define QUICKTHREADS_RISCV64_H |
| 3 | + |
| 4 | +// For QUICKTHREADS_SPUT in qt.h |
| 5 | +typedef unsigned long qt_word_t; |
| 6 | + |
| 7 | +extern void qt_start(void); |
| 8 | +extern void qt_vstart(void); |
| 9 | + |
| 10 | +extern void qt_error(void); |
| 11 | +extern void qt_align(void); |
| 12 | + |
| 13 | +// Stack must be 16-byte aligned at all times. |
| 14 | +#define QUICKTHREADS_STKALIGN (16) |
| 15 | +#define QUICKTHREADS_STKBASE (26 * sizeof(qt_word_t)) |
| 16 | +#define QUICKTHREADS_VSTKBASE (5 * sizeof(qt_word_t)) |
| 17 | + |
| 18 | +#define QUICKTHREADS_GROW_DOWN |
| 19 | +#define QUICKTHREADS_ADJ(sp) (((char *)sp) - QUICKTHREADS_STKBASE) |
| 20 | + |
| 21 | +// Initialize a single-argument thread. |
| 22 | +// |
| 23 | +// Set up link index to point to the true initializer, qt_start, |
| 24 | +// which will call only(pu, pt, userf) read from the stack. |
| 25 | +// |
| 26 | +// (*helper)(old_sp, a0, a1) will be called in between on the current |
| 27 | +// stack, so FRAME_INDEX needs to be correct and the other values |
| 28 | +// appropriately stored. |
| 29 | +#define QUICKTHREADS_ARGS(sp, pu, pt, userf, only) \ |
| 30 | + (QUICKTHREADS_SPUT(QUICKTHREADS_ADJ(sp), QUICKTHREADS_LINK_INDEX, qt_start), \ |
| 31 | + QUICKTHREADS_SPUT(QUICKTHREADS_ADJ(sp), QUICKTHREADS_FRAME_INDEX, sp), \ |
| 32 | + QUICKTHREADS_SPUT(QUICKTHREADS_ADJ(sp), QUICKTHREADS_ONLY_INDEX, only), \ |
| 33 | + QUICKTHREADS_SPUT(QUICKTHREADS_ADJ(sp), QUICKTHREADS_USER_INDEX, userf), \ |
| 34 | + QUICKTHREADS_SPUT(QUICKTHREADS_ADJ(sp), QUICKTHREADS_ARGT_INDEX, pt), \ |
| 35 | + QUICKTHREADS_SPUT(QUICKTHREADS_ADJ(sp), QUICKTHREADS_ARGU_INDEX, pu), \ |
| 36 | + ((qt_t *)QUICKTHREADS_ADJ(sp))) |
| 37 | + |
| 38 | +#define QUICKTHREADS_LINK_INDEX 0 // ra; standard |
| 39 | +#define QUICKTHREADS_FRAME_INDEX 1 // fp; standard |
| 40 | +#define QUICKTHREADS_ONLY_INDEX 2 // s1; arbitrary |
| 41 | +#define QUICKTHREADS_USER_INDEX 3 // s2; arbitrary |
| 42 | +#define QUICKTHREADS_ARGT_INDEX 4 // s3; arbitrary |
| 43 | +#define QUICKTHREADS_ARGU_INDEX 5 // s4; arbitrary |
| 44 | + |
| 45 | +#endif // QUICKTHREADS_RISCV64_H |
0 commit comments