entry64.S
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:5k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /* $Id: entry64.S,v 1.6 2000/01/12 02:59:26 davem Exp $
  2.  * entry64.S:  Solaris syscall emulation entry point.
  3.  *
  4.  * Copyright (C) 1996,1997,1998 Jakub Jelinek   (jj@sunsite.mff.cuni.cz)
  5.  * Copyright (C) 1995,1997 David S. Miller (davem@caip.rutgers.edu)
  6.  * Copyright (C) 1996 Miguel de Icaza      (miguel@nuclecu.unam.mx)
  7.  */
  8. #include <linux/errno.h>
  9. #include <asm/head.h>
  10. #include <asm/asi.h>
  11. #include <asm/smp.h>
  12. #include <asm/ptrace.h>
  13. #include <asm/page.h>
  14. #include <asm/signal.h>
  15. #include <asm/pgtable.h>
  16. #include <asm/processor.h>
  17. #include "conv.h"
  18. #define NR_SYSCALLS 256
  19. .text
  20. solaris_syscall_trace:
  21. call syscall_trace
  22.  nop
  23. srl %i0, 0, %o0
  24. mov %i4, %o4
  25. srl %i1, 0, %o1
  26. mov %i5, %o5
  27. andcc %l3, 1, %g0
  28. be,pt %icc, 2f
  29.  srl %i2, 0, %o2
  30. b,pt %xcc, 2f
  31.  add %sp, STACK_BIAS + REGWIN_SZ, %o0
  32. solaris_sucks:
  33. /* Solaris is a big system which needs to be able to do all the things
  34.  * in Inf+1 different ways */
  35. add %i6, 0x5c, %o0
  36. mov %i0, %g1
  37. mov %i1, %i0
  38. mov %i2, %i1
  39. srl %o0, 0, %o0
  40. mov %i3, %i2
  41. movrz %g1, 256, %g1 /* Ensure we don't loop forever */
  42. mov %i4, %i3
  43. mov %i5, %i4
  44. ba,pt %xcc, solaris_sparc_syscall
  45. exen:  lduwa [%o0] ASI_S, %i5
  46. exenf: ba,pt %xcc, solaris_sparc_syscall
  47.  clr %i5
  48. /* For shared binaries, binfmt_elf32 already sets up personality
  49.    and exec_domain. This is to handle static binaries as well */
  50. solaris_reg:
  51. call solaris_register
  52.  nop
  53. ba,pt %xcc, 1f
  54.  mov %i4, %o4
  55. linux_syscall_for_solaris:
  56. sll %l3, 2, %l4
  57. ba,pt %xcc, 10f
  58.  lduw [%l6 + %l4], %l3
  59. /* Solaris system calls enter here... */
  60. .align 32
  61. .globl solaris_sparc_syscall
  62. solaris_sparc_syscall:
  63. ldub [%g6 + AOFF_task_personality + ASIZ_task_personality - 1], %l0
  64. cmp %g1, 255
  65. bg,pn %icc, solaris_unimplemented
  66.  srl %g1, 0, %g1
  67. sethi %hi(solaris_sys_table), %l7
  68. brz,pn %g1, solaris_sucks
  69.  mov %i4, %o4
  70. sll %g1, 2, %l4
  71. cmp %l0, 1
  72. bne,pn %icc, solaris_reg
  73. 1:  srl %i0, 0, %o0
  74. lduw [%l7 + %l4], %l3
  75. srl %i1, 0, %o1
  76. ldx [%g6 + AOFF_task_flags], %l5
  77. cmp %l3, NR_SYSCALLS
  78. bleu,a,pn %xcc, linux_syscall_for_solaris
  79.  sethi %hi(sys_call_table32), %l6
  80. andcc %l3, 1, %g0
  81. bne,a,pn %icc, 10f
  82.  add %sp, STACK_BIAS + REGWIN_SZ, %o0
  83. 10: srl %i2, 0, %o2
  84. mov %i5, %o5
  85. andn %l3, 3, %l7
  86. andcc %l5, 0x20, %g0
  87. bne,pn %icc, solaris_syscall_trace
  88.  mov %i0, %l5
  89. 2: call %l7
  90.  srl %i3, 0, %o3
  91. ret_from_solaris:
  92. stx %o0, [%sp + STACK_BIAS + REGWIN_SZ + PT_V9_I0]
  93. ldx [%g6 + AOFF_task_flags], %l6
  94. sra %o0, 0, %o0
  95. mov %ulo(TSTATE_XCARRY | TSTATE_ICARRY), %g2
  96. ldx [%sp + STACK_BIAS + REGWIN_SZ + PT_V9_TSTATE], %g3
  97. cmp %o0, -ENOIOCTLCMD
  98. sllx %g2, 32, %g2
  99. bgeu,pn %xcc, 1f
  100.  andcc %l6, 0x20, %l6
  101. /* System call success, clear Carry condition code. */
  102. andn %g3, %g2, %g3
  103. stx %g3, [%sp + STACK_BIAS + REGWIN_SZ + PT_V9_TSTATE]
  104. bne,pn %icc, solaris_syscall_trace2
  105.  ldx [%sp + STACK_BIAS + REGWIN_SZ + PT_V9_TNPC], %l1
  106. andcc %l1, 1, %g0
  107. bne,pn %icc, 2f
  108.  clr %l6
  109. add %l1, 0x4, %l2          
  110. stx %l1, [%sp + STACK_BIAS + REGWIN_SZ + PT_V9_TPC]  ! pc = npc
  111. call rtrap
  112.  stx %l2, [%sp + STACK_BIAS + REGWIN_SZ + PT_V9_TNPC] !npc = npc+4
  113. /* When tnpc & 1, this comes from setcontext and we don't want to advance pc */
  114. 2: andn %l1, 3, %l1
  115. call rtrap
  116.  stx %l1, [%sp + STACK_BIAS + REGWIN_SZ + PT_V9_TNPC] !npc = npc&~3
  117. 1:
  118. /* System call failure, set Carry condition code.
  119.  * Also, get abs(errno) to return to the process.
  120.  */
  121. sub %g0, %o0, %o0
  122. or %g3, %g2, %g3
  123. cmp %o0, ERANGE /* 0-ERANGE are identity mapped */
  124. bleu,pt %icc, 1f
  125.  cmp %o0, EMEDIUMTYPE
  126. bgu,pn %icc, 1f
  127.  sethi %hi(solaris_err_table), %l6
  128. sll %o0, 2, %o0
  129. or %l6, %lo(solaris_err_table), %l6
  130. ldsw [%l6 + %o0], %o0
  131. 1: stx %o0, [%sp + STACK_BIAS + REGWIN_SZ + PT_V9_I0]
  132. mov 1, %l6
  133. stx %g3, [%sp + STACK_BIAS + REGWIN_SZ + PT_V9_TSTATE]
  134. bne,pn %icc, solaris_syscall_trace2
  135.  ldx [%sp + STACK_BIAS + REGWIN_SZ + PT_V9_TNPC], %l1
  136. andcc %l1, 1, %g0
  137. bne,pn %icc, 2b
  138.  add %l1, 0x4, %l2
  139. stx %l1, [%sp + STACK_BIAS + REGWIN_SZ + PT_V9_TPC]  ! pc = npc
  140. call rtrap
  141.  stx %l2, [%sp + STACK_BIAS + REGWIN_SZ + PT_V9_TNPC] !npc = npc+4 
  142. solaris_syscall_trace2:
  143. call syscall_trace
  144.  add %l1, 0x4, %l2 /* npc = npc+4 */
  145. andcc %l1, 1, %g0
  146. bne,pn %icc, 2b
  147.  nop
  148. stx %l1, [%sp + STACK_BIAS + REGWIN_SZ + PT_V9_TPC]
  149. call rtrap
  150.  stx %l2, [%sp + STACK_BIAS + REGWIN_SZ + PT_V9_TNPC]
  151. /* This one is tricky, so that's why we do it in assembly */
  152. .globl solaris_sigsuspend
  153. solaris_sigsuspend:
  154. call do_sol_sigsuspend
  155.  nop
  156. brlz,pn %o0, ret_from_solaris
  157.  nop
  158. call sys_sigsuspend
  159.  stx %o0, [%sp + STACK_BIAS + REGWIN_SZ + PT_V9_I0]
  160. .globl solaris_getpid
  161. solaris_getpid:
  162. call sys_getppid /* This is tricky, so don't do it in assembly */
  163.  nop
  164. stx %o0, [%sp + STACK_BIAS + REGWIN_SZ + PT_V9_I1]
  165. b,pt %xcc, ret_from_solaris
  166.  lduw [%g6 + AOFF_task_pid], %o0
  167. .globl solaris_getuid
  168. solaris_getuid:
  169. lduw [%g6 + AOFF_task_euid], %o1
  170. lduw [%g6 + AOFF_task_uid], %o0
  171. b,pt %xcc, ret_from_solaris
  172.  stx %o1, [%sp + STACK_BIAS + REGWIN_SZ + PT_V9_I1]
  173. .globl solaris_getgid
  174. solaris_getgid:
  175. lduw [%g6 + AOFF_task_egid], %o1
  176. lduw [%g6 + AOFF_task_gid], %o0
  177. b,pt %xcc, ret_from_solaris
  178.  stx %o1, [%sp + STACK_BIAS + REGWIN_SZ + PT_V9_I1]
  179. .globl solaris_unimplemented
  180. solaris_unimplemented:
  181. call do_sol_unimplemented
  182.  add %sp, STACK_BIAS + REGWIN_SZ, %o0
  183. ba,pt %xcc, ret_from_solaris
  184.  nop
  185. .section __ex_table,#alloc
  186. .align 4
  187. .word exen, exenf