This is an extern struct so that inline assembly in current can use field offsets.
const Csky = extern struct
const Csky = extern struct {
/// The numbered general-purpose registers r0 - r31.
r: [32]Gpr,
pc: Gpr,
pub const Gpr = u32;
pub inline fn current() Csky {
var ctx: Csky = undefined;
asm volatile (
\\ stm r0-r31, (t0)
\\ grs t1, 1f
\\1:
\\ st32.w t1, (t0, 128)
:
: [ctx] "{r12}" (&ctx),
: .{ .r13 = true, .memory = true });
return ctx;
}
pub fn getFp(ctx: *const Csky) usize {
return ctx.r[14];
}
pub fn getPc(ctx: *const Csky) usize {
return ctx.pc;
}
pub fn dwarfRegisterBytes(ctx: *Csky, register_num: u16) DwarfRegisterError![]u8 {
switch (register_num) {
0...31 => return @ptrCast(&ctx.r[register_num]),
64 => return @ptrCast(&ctx.pc),
32...63 => return error.UnsupportedRegister, // f0 - f31
else => return error.InvalidRegister,
}
}
}