Skip to content

Commit 097cfd7

Browse files
authored
builtin: guard linux_bare amd64 syscall asm with $if amd64 (#27564)
1 parent f05b045 commit 097cfd7

1 file changed

Lines changed: 97 additions & 76 deletions

File tree

vlib/builtin/linux_bare/linux_syscalls.v

Lines changed: 97 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -330,116 +330,137 @@ $if !i386 {
330330
}
331331
}
332332

333+
// The syscall primitives stay defined for every non-i386 arch so the wrappers
334+
// above remain resolvable; only the inline asm is amd64-gated. On a non-amd64
335+
// target each returns -ENOSYS (38) -- a failed syscall rather than a fake
336+
// success -- so e.g. mm_alloc sees the mmap error instead of dereferencing 0.
337+
// A real non-x86 freestanding build must supply its own syscall + startup layer.
333338
fn sys_call0(scn u64) u64 {
334-
mut res := u64(0)
335-
asm amd64 {
336-
syscall
337-
; =a (res)
338-
; 0 (scn)
339+
mut res := u64(-i64(38)) // -ENOSYS, overwritten by the syscall on amd64
340+
$if amd64 {
341+
asm amd64 {
342+
syscall
343+
; =a (res)
344+
; 0 (scn)
345+
}
339346
}
340347
return res
341348
}
342349

343350
fn sys_call1(scn u64, arg1 u64) u64 {
344-
mut res := u64(0)
345-
asm amd64 {
346-
syscall
347-
; =a (res)
348-
; 0 (scn)
349-
D (arg1)
351+
mut res := u64(-i64(38)) // -ENOSYS, overwritten by the syscall on amd64
352+
$if amd64 {
353+
asm amd64 {
354+
syscall
355+
; =a (res)
356+
; 0 (scn)
357+
D (arg1)
358+
}
350359
}
351360
return res
352361
}
353362

354363
fn sys_call2(scn u64, arg1 u64, arg2 u64) u64 {
355-
mut res := u64(0)
356-
asm amd64 {
357-
syscall
358-
; =a (res)
359-
; 0 (scn)
360-
D (arg1)
361-
S (arg2)
364+
mut res := u64(-i64(38)) // -ENOSYS, overwritten by the syscall on amd64
365+
$if amd64 {
366+
asm amd64 {
367+
syscall
368+
; =a (res)
369+
; 0 (scn)
370+
D (arg1)
371+
S (arg2)
372+
}
362373
}
363374
return res
364375
}
365376

366377
fn sys_call3(scn u64, arg1 u64, arg2 u64, arg3 u64) u64 {
367-
mut res := u64(0)
368-
asm amd64 {
369-
syscall
370-
; =a (res)
371-
; 0 (scn)
372-
D (arg1)
373-
S (arg2)
374-
d (arg3)
378+
mut res := u64(-i64(38)) // -ENOSYS, overwritten by the syscall on amd64
379+
$if amd64 {
380+
asm amd64 {
381+
syscall
382+
; =a (res)
383+
; 0 (scn)
384+
D (arg1)
385+
S (arg2)
386+
d (arg3)
387+
}
375388
}
376389
return res
377390
}
378391

379392
fn sys_call4(scn u64, arg1 u64, arg2 u64, arg3 u64, arg4 u64) u64 {
380-
mut res := u64(0)
381-
asm amd64 {
382-
mov r10, arg4
383-
syscall
384-
; =a (res)
385-
; 0 (scn)
386-
D (arg1)
387-
S (arg2)
388-
d (arg3)
389-
g (arg4)
390-
; r10
393+
mut res := u64(-i64(38)) // -ENOSYS, overwritten by the syscall on amd64
394+
$if amd64 {
395+
asm amd64 {
396+
mov r10, arg4
397+
syscall
398+
; =a (res)
399+
; 0 (scn)
400+
D (arg1)
401+
S (arg2)
402+
d (arg3)
403+
g (arg4)
404+
; r10
405+
}
391406
}
392407
return res
393408
}
394409

395410
fn sys_call5(scn u64, arg1 u64, arg2 u64, arg3 u64, arg4 u64, arg5 u64) u64 {
396-
mut res := u64(0)
397-
asm amd64 {
398-
mov r10, arg4
399-
mov r8, arg5
400-
syscall
401-
; =a (res)
402-
; 0 (scn)
403-
D (arg1)
404-
S (arg2)
405-
d (arg3)
406-
g (arg4)
407-
g (arg5)
408-
; r10
409-
r8
411+
mut res := u64(-i64(38)) // -ENOSYS, overwritten by the syscall on amd64
412+
$if amd64 {
413+
asm amd64 {
414+
mov r10, arg4
415+
mov r8, arg5
416+
syscall
417+
; =a (res)
418+
; 0 (scn)
419+
D (arg1)
420+
S (arg2)
421+
d (arg3)
422+
g (arg4)
423+
g (arg5)
424+
; r10
425+
r8
426+
}
410427
}
411428
return res
412429
}
413430

414431
fn sys_call6(scn u64, arg1 u64, arg2 u64, arg3 u64, arg4 u64, arg5 i64, arg6 u64) u64 {
415-
mut res := u64(0)
416-
asm amd64 {
417-
mov r10, arg4
418-
mov r8, arg5
419-
mov r9, arg6
420-
syscall
421-
; =a (res)
422-
; 0 (scn)
423-
D (arg1)
424-
S (arg2)
425-
d (arg3)
426-
g (arg4)
427-
g (arg5)
428-
g (arg6)
429-
; r10
430-
r8
431-
r9
432+
mut res := u64(-i64(38)) // -ENOSYS, overwritten by the syscall on amd64
433+
$if amd64 {
434+
asm amd64 {
435+
mov r10, arg4
436+
mov r8, arg5
437+
mov r9, arg6
438+
syscall
439+
; =a (res)
440+
; 0 (scn)
441+
D (arg1)
442+
S (arg2)
443+
d (arg3)
444+
g (arg4)
445+
g (arg5)
446+
g (arg6)
447+
; r10
448+
r8
449+
r9
450+
}
432451
}
433452
return res
434453
}
435454

436-
asm amd64 {
437-
.globl _start
438-
_start:
439-
call main
440-
mov rax, 60
441-
xor rdi, rdi
442-
syscall
443-
ret
455+
$if amd64 {
456+
asm amd64 {
457+
.globl _start
458+
_start:
459+
call main
460+
mov rax, 60
461+
xor rdi, rdi
462+
syscall
463+
ret
464+
}
444465
}
445466
}

0 commit comments

Comments
 (0)