@@ -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