1
0
mirror of https://github.com/golang/go synced 2024-11-18 15:04:44 -07:00

cmd/internal/obj/riscv: add environment call/breakpoint and base counter/timer instructions

This implements assembler support for ECALL/EBREAK, along with base
counter/timer instructions.

Based on riscv-go port.

Updates #27532

Change-Id: I690a9fd835eeddee1fe9a5616d2b2f856d3952b8
Reviewed-on: https://go-review.googlesource.com/c/go/+/195918
Reviewed-by: Cherry Zhang <cherryyz@google.com>
Run-TryBot: Cherry Zhang <cherryyz@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
This commit is contained in:
Joel Sing 2019-09-08 04:11:07 +10:00
parent 211932b987
commit ced2454220
2 changed files with 53 additions and 0 deletions

View File

@ -116,6 +116,19 @@ TEXT asmtest(SB),DUPOK|NOSPLIT,$0
REMW X5, X6, X7 // bb635302 REMW X5, X6, X7 // bb635302
REMUW X5, X6, X7 // bb735302 REMUW X5, X6, X7 // bb735302
// 10.1: Base Counters and Timers
RDCYCLE X5 // f32200c0
RDTIME X5 // f32210c0
RDINSTRET X5 // f32220c0
// Privileged ISA
// 3.2.1: Environment Call and Breakpoint
ECALL // 73000000
SCALL // 73000000
EBREAK // 73001000
SBREAK // 73001000
// Arbitrary bytes (entered in little-endian mode) // Arbitrary bytes (entered in little-endian mode)
WORD $0x12345678 // WORD $305419896 // 78563412 WORD $0x12345678 // WORD $305419896 // 78563412
WORD $0x9abcdef0 // WORD $2596069104 // f0debc9a WORD $0x9abcdef0 // WORD $2596069104 // f0debc9a

View File

@ -68,6 +68,35 @@ func progedit(ctxt *obj.Link, p *obj.Prog, newprog obj.ProgAlloc) {
p.As = ASRAI p.As = ASRAI
} }
} }
switch p.As {
case obj.AUNDEF, AECALL, AEBREAK, ASCALL, ASBREAK, ARDCYCLE, ARDTIME, ARDINSTRET:
switch p.As {
case obj.AUNDEF:
p.As = AEBREAK
case ASCALL:
// SCALL is the old name for ECALL.
p.As = AECALL
case ASBREAK:
// SBREAK is the old name for EBREAK.
p.As = AEBREAK
}
ins := encode(p.As)
if ins == nil {
panic("progedit: tried to rewrite nonexistent instruction")
}
// The CSR isn't exactly an offset, but it winds up in the
// immediate area of the encoded instruction, so record it in
// the Offset field.
p.From.Type = obj.TYPE_CONST
p.From.Offset = ins.csr
p.Reg = REG_ZERO
if p.To.Type == obj.TYPE_NONE {
p.To.Type, p.To.Reg = obj.TYPE_REG, REG_ZERO
}
}
} }
// setPCs sets the Pc field in all instructions reachable from p. // setPCs sets the Pc field in all instructions reachable from p.
@ -391,6 +420,17 @@ var encodingForAs = [ALAST & obj.AMask]encoding{
AREMW & obj.AMask: rIIIEncoding, AREMW & obj.AMask: rIIIEncoding,
AREMUW & obj.AMask: rIIIEncoding, AREMUW & obj.AMask: rIIIEncoding,
// 10.1: Base Counters and Timers
ARDCYCLE & obj.AMask: iIEncoding,
ARDTIME & obj.AMask: iIEncoding,
ARDINSTRET & obj.AMask: iIEncoding,
// Privileged ISA
// 3.2.1: Environment Call and Breakpoint
AECALL & obj.AMask: iIEncoding,
AEBREAK & obj.AMask: iIEncoding,
// Escape hatch // Escape hatch
AWORD & obj.AMask: rawEncoding, AWORD & obj.AMask: rawEncoding,