mirror of
https://github.com/ziglang/zig.git
synced 2025-12-06 14:23:09 +00:00
std.debug.cpu_context: add kvx context implementation
This commit is contained in:
parent
80e567b6bd
commit
94b6c7ce5f
@ -9,6 +9,7 @@ else switch (native_arch) {
|
|||||||
.arm, .armeb, .thumb, .thumbeb => Arm,
|
.arm, .armeb, .thumb, .thumbeb => Arm,
|
||||||
.csky => Csky,
|
.csky => Csky,
|
||||||
.hexagon => Hexagon,
|
.hexagon => Hexagon,
|
||||||
|
.kvx => Kvx,
|
||||||
.lanai => Lanai,
|
.lanai => Lanai,
|
||||||
.loongarch32, .loongarch64 => LoongArch,
|
.loongarch32, .loongarch64 => LoongArch,
|
||||||
.m68k => M68k,
|
.m68k => M68k,
|
||||||
@ -493,6 +494,71 @@ const Hexagon = extern struct {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/// This is an `extern struct` so that inline assembly in `current` can use field offsets.
|
||||||
|
const Kvx = extern struct {
|
||||||
|
r: [64]u64,
|
||||||
|
ra: u64,
|
||||||
|
pc: u64,
|
||||||
|
|
||||||
|
pub inline fn current() Kvx {
|
||||||
|
var ctx: Kvx = undefined;
|
||||||
|
asm volatile (
|
||||||
|
\\ so (0)[$r32] = $r0r1r2r3
|
||||||
|
\\ ;;
|
||||||
|
\\ so (32)[$r32] = $r4r5r6r7
|
||||||
|
\\ ;;
|
||||||
|
\\ so (64)[$r32] = $r8r9r10r11
|
||||||
|
\\ ;;
|
||||||
|
\\ so (96)[$r32] = $r12r13r14r15
|
||||||
|
\\ ;;
|
||||||
|
\\ so (128)[$r32] = $r16r17r18r19
|
||||||
|
\\ ;;
|
||||||
|
\\ so (160)[$r32] = $r20r21r22r23
|
||||||
|
\\ ;;
|
||||||
|
\\ so (192)[$r32] = $r24r25r26r27
|
||||||
|
\\ ;;
|
||||||
|
\\ so (224)[$r32] = $r28r29r30r31
|
||||||
|
\\ ;;
|
||||||
|
\\ so (256)[$r32] = $r32r33r34r35
|
||||||
|
\\ ;;
|
||||||
|
\\ so (288)[$r32] = $r36r37r38r39
|
||||||
|
\\ ;;
|
||||||
|
\\ so (320)[$r32] = $r40r41r42r43
|
||||||
|
\\ ;;
|
||||||
|
\\ so (352)[$r32] = $r44r45r46r47
|
||||||
|
\\ ;;
|
||||||
|
\\ so (384)[$r32] = $r48r49r50r51
|
||||||
|
\\ ;;
|
||||||
|
\\ so (416)[$r32] = $r52r53r54r55
|
||||||
|
\\ ;;
|
||||||
|
\\ so (448)[$r32] = $r56r57r58r59
|
||||||
|
\\ get $r34 = $pc
|
||||||
|
\\ ;;
|
||||||
|
\\ so (480)[$r32] = $r60r61r62r63
|
||||||
|
\\ get $r35 = $ra
|
||||||
|
\\ ;;
|
||||||
|
\\ sq (512)[$r32] = $r34r35
|
||||||
|
:
|
||||||
|
: [ctx] "{r32}" (&ctx),
|
||||||
|
: .{ .r34 = true, .r35 = true, .memory = true });
|
||||||
|
return ctx;
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn dwarfRegisterBytes(ctx: *Kvx, register_num: u16) DwarfRegisterError![]u8 {
|
||||||
|
switch (register_num) {
|
||||||
|
0...63 => return @ptrCast(&ctx.r[register_num]),
|
||||||
|
64 => return @ptrCast(&ctx.pc),
|
||||||
|
67 => return @ptrCast(&ctx.ra),
|
||||||
|
|
||||||
|
65...66 => return error.UnsupportedRegister, // SFRs
|
||||||
|
68...255 => return error.UnsupportedRegister, // SFRs
|
||||||
|
256...767 => return error.UnsupportedRegister, // XCRs
|
||||||
|
|
||||||
|
else => return error.InvalidRegister,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
/// This is an `extern struct` so that inline assembly in `current` can use field offsets.
|
/// This is an `extern struct` so that inline assembly in `current` can use field offsets.
|
||||||
const Lanai = extern struct {
|
const Lanai = extern struct {
|
||||||
r: [32]u32,
|
r: [32]u32,
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user