Skip to content

Commit 09810ae

Browse files
committed
Add support for F_GETFD in order to support go1.22+
1 parent 25feabf commit 09810ae

File tree

4 files changed

+85
-0
lines changed

4 files changed

+85
-0
lines changed

rvgo/fast/vm.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -486,6 +486,26 @@ func (inst *InstrumentedState) riscvStep() (outErr error) {
486486
var out U64
487487
var errCode U64
488488
switch cmd {
489+
case 0x1: // F_GETFD: get file descriptor flags
490+
switch fd {
491+
case 0: // stdin
492+
out = toU64(0) // no flag set
493+
case 1: // stdout
494+
out = toU64(0) // no flag set
495+
case 2: // stderr
496+
out = toU64(0) // no flag set
497+
case 3: // hint-read
498+
out = toU64(0) // no flag set
499+
case 4: // hint-write
500+
out = toU64(0) // no flag set
501+
case 5: // pre-image read
502+
out = toU64(0) // no flag set
503+
case 6: // pre-image write
504+
out = toU64(0) // no flag set
505+
default:
506+
out = u64Mask()
507+
errCode = toU64(0x4d) //EBADF
508+
}
489509
case 0x3: // F_GETFL: get file descriptor flags
490510
switch fd {
491511
case 0: // stdin

rvgo/slow/vm.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -666,6 +666,26 @@ func Step(calldata []byte, po PreimageOracle) (stateHash common.Hash, outErr err
666666
var out U64
667667
var errCode U64
668668
switch cmd.val() {
669+
case 0x1: // F_GETFD: get file descriptor flags
670+
switch fd.val() {
671+
case 0: // stdin
672+
out = toU64(0) // no flag set
673+
case 1: // stdout
674+
out = toU64(0) // no flag set
675+
case 2: // stderr
676+
out = toU64(0) // no flag set
677+
case 3: // hint-read
678+
out = toU64(0) // no flag set
679+
case 4: // hint-write
680+
out = toU64(0) // no flag set
681+
case 5: // pre-image read
682+
out = toU64(0) // no flag set
683+
case 6: // pre-image write
684+
out = toU64(0) // no flag set
685+
default:
686+
out = u64Mask()
687+
errCode = toU64(0x4d) //EBADF
688+
}
669689
case 0x3: // F_GETFL: get file descriptor flags
670690
switch fd.val() {
671691
case 0: // stdin

rvgo/test/syscall_test.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -476,6 +476,15 @@ func FuzzStateSyscallFcntl(f *testing.F) {
476476
// Add 7 to fd to ensure fd > 6
477477
testFcntl(t, fd+7, 3, pc, step, 0xFFFF_FFFF_FFFF_FFFF, 0x4d)
478478

479+
// Test F_GETFD
480+
for _, fd := range []uint64{0, 1, 2, 3, 4, 5, 6} {
481+
testFcntl(t, fd, 1, pc, step, 0, 0)
482+
}
483+
484+
// Test F_GETFD for unsupported fds
485+
// Add 7 to fd to ensure fd > 6
486+
testFcntl(t, fd+7, 1, pc, step, 0xFFFF_FFFF_FFFF_FFFF, 0x4d)
487+
479488
// Test other commands
480489
if cmd == 3 {
481490
// Set arbitrary commands if cmd is F_GETFL

rvsol/src/RISCV.sol

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -994,6 +994,42 @@ contract RISCV {
994994
let out := 0
995995
let errCode := 0
996996
switch cmd
997+
case 0x1 {
998+
// F_GETFD: get file descriptor flags
999+
switch fd
1000+
case 0 {
1001+
// stdin
1002+
out := toU64(0) // no flag set
1003+
}
1004+
case 1 {
1005+
// stdout
1006+
out := toU64(0) // no flag set
1007+
}
1008+
case 2 {
1009+
// stderr
1010+
out := toU64(0) // no flag set
1011+
}
1012+
case 3 {
1013+
// hint-read
1014+
out := toU64(0) // no flag set
1015+
}
1016+
case 4 {
1017+
// hint-write
1018+
out := toU64(0) // no flag set
1019+
}
1020+
case 5 {
1021+
// pre-image read
1022+
out := toU64(0) // no flag set
1023+
}
1024+
case 6 {
1025+
// pre-image write
1026+
out := toU64(0) // no flag set
1027+
}
1028+
default {
1029+
out := u64Mask()
1030+
errCode := toU64(0x4d) //EBADF
1031+
}
1032+
}
9971033
case 0x3 {
9981034
// F_GETFL: get file descriptor flags
9991035
switch fd

0 commit comments

Comments
 (0)