stub.S 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. #include "uml-config.h"
  2. #include "as-layout.h"
  3. .globl syscall_stub
  4. .section .__syscall_stub, "x"
  5. syscall_stub:
  6. syscall
  7. /* We don't have 64-bit constants, so this constructs the address
  8. * we need.
  9. */
  10. movq $(ASM_STUB_DATA >> 32), %rbx
  11. salq $32, %rbx
  12. movq $(ASM_STUB_DATA & 0xffffffff), %rcx
  13. or %rcx, %rbx
  14. movq %rax, (%rbx)
  15. int3
  16. .globl batch_syscall_stub
  17. batch_syscall_stub:
  18. mov $(ASM_STUB_DATA >> 32), %rbx
  19. sal $32, %rbx
  20. mov $(ASM_STUB_DATA & 0xffffffff), %rax
  21. or %rax, %rbx
  22. /* load pointer to first operation */
  23. mov %rbx, %rsp
  24. add $0x10, %rsp
  25. again:
  26. /* load length of additional data */
  27. mov 0x0(%rsp), %rax
  28. /* if(length == 0) : end of list */
  29. /* write possible 0 to header */
  30. mov %rax, 8(%rbx)
  31. cmp $0, %rax
  32. jz done
  33. /* save current pointer */
  34. mov %rsp, 8(%rbx)
  35. /* skip additional data */
  36. add %rax, %rsp
  37. /* load syscall-# */
  38. pop %rax
  39. /* load syscall params */
  40. pop %rdi
  41. pop %rsi
  42. pop %rdx
  43. pop %r10
  44. pop %r8
  45. pop %r9
  46. /* execute syscall */
  47. syscall
  48. /* check return value */
  49. pop %rcx
  50. cmp %rcx, %rax
  51. je again
  52. done:
  53. /* save return value */
  54. mov %rax, (%rbx)
  55. /* stop */
  56. int3