l64vsyscall.S 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. #include "mem.h"
  2. #include "amd64l.h"
  3. #ifndef __ASSEMBLER__
  4. #define __ASSEMBLER__
  5. #endif
  6. .globl sce
  7. .globl scx
  8. /*
  9. * starting the user program up. First time.
  10. */
  11. .globl touser
  12. touser:
  13. CLI
  14. SWAPGS
  15. // we should be able to skip this step. We'll see.
  16. MOVQ $SSEL(SiUDS, SsRPL3), %rax
  17. MOVW %ax, %ds
  18. MOVW %ax, %es
  19. /*
  20. * FS is used for TLS. Don't touch!
  21. MOVW AX, FS
  22. */
  23. MOVW %ax, %gs
  24. // Hmm. Assuumes many things, eh? Assumes plan 9 a.out
  25. // format. This will fail.
  26. MOVQ $(UTZERO+0x20), %rcx /* ip */
  27. MOVQ $If, %R11 /* flags */
  28. MOVQ %RDI, %RSP /* sp */
  29. sysretq
  30. // BYTE $0x48; SYSRET /* SYSRETQ */
  31. /*
  32. */
  33. .global syscallentry
  34. syscallentry:
  35. incq sce
  36. SWAPGS
  37. movq %gs:0, %r15
  38. movq 16(%r15), %r15 /* m->proc */
  39. // NOTE! This assumes sizeof(Label) == 16!
  40. MOVQ %rsp, %r14
  41. MOVQ 16*8(%r15), %rsp /* m->proc->kstack */
  42. ADDQ $KSTACK, %rSP
  43. PUSHQ $SSEL(SiUDS, SsRPL3) /* old stack segment */
  44. PUSHQ %r14 /* old sp */
  45. PUSHQ %r11 /* old flags */
  46. PUSHQ $SSEL(SiUCS, SsRPL3) /* old code segment */
  47. PUSHQ %rCX /* old ip */
  48. // NOTE: we need to make this look like uregs. That includes
  49. // two uint64_ts for type and error. Total is 17.
  50. SUBQ $(17*8), %rsp /* unsaved registers */
  51. MOVQ %rAX, (0)(%rsp)
  52. MOVQ %rBX, (1*8)(%rsp)
  53. MOVQ %rCX, (2*8)(%rsp)
  54. MOVQ %rDX, (3*8)(%rsp)
  55. MOVQ %rSI, (4*8)(%rsp)
  56. MOVQ %rDI, (5*8)(%rsp)
  57. MOVQ %rBP, (6*8)(%rsp)
  58. MOVQ %r8, (7*8)(%rsp)
  59. MOVQ %r9, (8*8)(%rsp)
  60. MOVQ %r10, (9*8)(%rsp)
  61. MOVQ %r11, (10*8)(%rsp)
  62. MOVQ %r12, (11*8)(%rsp)
  63. #if 0
  64. // don't bother yet.
  65. MOVW $SSEL(SiUDS, SsRPL3), (15*8+0)(%rsp)
  66. MOVW ES, (15*8+2)(%rsp)
  67. MOVW FS, (15*8+4)(%rsp)
  68. MOVW GS, (15*8+6)(%rsp)
  69. #endif
  70. MOVQ %rsp, %rsi /* Ureg* */
  71. // system call number is in %r9
  72. movq %r9, %rdi
  73. CALL syscall
  74. .globl syscallreturn
  75. syscallreturn:
  76. #ifdef NOTNOW
  77. /* we do the TLS setup in linuxsyscall.c.
  78. * Leave this here in case we ever think it should be done
  79. * here.
  80. */
  81. /* this is the time to set up TLS */
  82. /* TLS is held in proc->tls, offset 32 */
  83. /* we need to pull it into DX:AX, set C0000100 into CX,
  84. * and do a WRMSR
  85. */
  86. /* consider pushing RUSER (above) and popping it here. */
  87. XORL AX, AX
  88. MOVW AX, FS
  89. BYTE $0x65; MOVQ 0, RMACH /* m-> (MOVQ GS:0x0, R15) */
  90. MOVQ 16(RMACH), RUSER /* m->proc */
  91. MOVQ 32(RUSER), AX /* m->proc->tls */
  92. MOVQ AX, DX
  93. SHRQ $32, DX
  94. MOVL $0xC0000100, CX
  95. WRMSR
  96. #endif
  97. MOVQ 0(%rsp), %rAX /* Ureg.ax */
  98. MOVQ (6*8)(%rsp), %rBP /* Ureg.bp */
  99. _linuxsyscallreturn:
  100. MOVQ (14*8)(%rsp),%r15
  101. MOVQ (13*8)(%rsp),%r14
  102. MOVQ (12*8)(%rsp),%r13
  103. MOVQ (11*8)(%rsp),%r12
  104. MOVQ (9*8)(%rsp),%r10
  105. MOVQ (8*8)(%rsp),%r9
  106. MOVQ (7*8)(%rsp),%r8
  107. MOVQ (6*8)(%rsp),%rBP
  108. MOVQ (5*8)(%rsp),%rDI
  109. MOVQ (4*8)(%rsp),%rSI
  110. MOVQ (3*8)(%rsp),%rDX
  111. MOVQ (1*8)(%rsp),%rBX
  112. ADDQ $(17*8), %rsp /* registers + arguments */
  113. /* the CLI should maybe be done sooner */
  114. CLI
  115. SWAPGS
  116. #if 0
  117. MOVW 0(%rsp), DS
  118. MOVW 2(%rsp), ES
  119. /* This breaks TLS.
  120. MOVW 4(%rsp), FS
  121. */
  122. MOVW 6(%rsp), GS
  123. #endif
  124. MOVQ 0(%rsp), %rCX /* ip */
  125. MOVQ 16(%rsp), %r11 /* flags */
  126. MOVQ 24(%rsp), %rSP /* sp */
  127. incq scx
  128. sysretq
  129. // BYTE $0x48; SYSRET /* SYSRETQ */
  130. .globl sysrforkret
  131. sysrforkret:
  132. // CALL linuxclonefinish(SB)
  133. // DEBUG
  134. MOVQ $0, %rAX
  135. JMP syscallreturn