gate.S
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:4k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  *
  3.  * Linux/PARISC Project (http://www.parisc-linux.org/)
  4.  *
  5.  * System call entry code Copyright (c) Matthew Wilcox 1999 <willy@bofh.ai>
  6.  * Licensed under the GNU GPL.
  7.  * thanks to Philipp Rumpf, Mike Shaver and various others
  8.  * sorry about the wall, puffin..
  9.  */
  10. #include <asm/assembly.h>
  11. #include <asm/offset.h>
  12. #include <asm/unistd.h>
  13. #include <asm/errno.h>
  14. #ifdef __LP64__
  15. .level          2.0w
  16. #else
  17. .level 1.1
  18. #endif
  19. .text
  20. #ifdef __LP64__
  21. #define FRAME_SIZE 128
  22. #else
  23. #define FRAME_SIZE 64
  24. #endif
  25. .import hpux_call_table
  26. .import hpux_syscall_exit,code
  27. .export hpux_gateway_page
  28. .align 4096
  29. hpux_gateway_page:
  30. nop
  31. #ifdef __LP64__
  32. #warning NEEDS WORK for 64-bit
  33. #endif
  34. ldw     -64(%r30), %r29                 ;! 8th argument
  35. ldw -60(%r30), %r19 ;! 7th argument
  36. ldw -56(%r30), %r20 ;! 6th argument
  37. ldw -52(%r30), %r21 ;! 5th argument
  38. gate .+8, %r0 /* become privileged */
  39. mtsp %r0,%sr4 /* get kernel space into sr4 */
  40. mtsp %r0,%sr5 /* get kernel space into sr5 */
  41. mtsp %r0,%sr6 /* get kernel space into sr6 */
  42. mfsp    %sr7,%r1                        /* save user sr7 */
  43. mtsp    %r1,%sr3                        /* and store it in sr3 */
  44. mtctl   %r30,%cr28
  45. mfctl   %cr30,%r1
  46. xor     %r1,%r30,%r30                   /* ye olde xor trick */
  47. xor     %r1,%r30,%r1
  48. xor     %r1,%r30,%r30
  49. ldo     TASK_SZ_ALGN+FRAME_SIZE(%r30),%r30  /* set up kernel stack */
  50. /* N.B.: It is critical that we don't set sr7 to 0 until r30
  51.  *       contains a valid kernel stack pointer. It is also
  52.  *       critical that we don't start using the kernel stack
  53.  *       until after sr7 has been set to 0.
  54.  */
  55. mtsp %r0,%sr7 /* get kernel space into sr7 */
  56. STREG   %r1,TASK_PT_GR30-TASK_SZ_ALGN-FRAME_SIZE(%r30) /* save usp */
  57. ldo     -TASK_SZ_ALGN-FRAME_SIZE(%r30),%r1   /* get task ptr in %r1 */
  58. /* Save some registers for sigcontext and potential task
  59.    switch (see entry.S for the details of which ones are
  60.    saved/restored).  TASK_PT_PSW is zeroed so we can see whether
  61.    a process is on a syscall or not.  For an interrupt the real
  62.    PSW value is stored.  This is needed for gdb and sys_ptrace. */
  63. STREG %r0,  TASK_PT_PSW(%r1)
  64. STREG %r2,  TASK_PT_GR2(%r1) /* preserve rp */
  65. STREG   %r19, TASK_PT_GR19(%r1)         /* 7th argument */
  66. STREG   %r20, TASK_PT_GR20(%r1)         /* 6th argument */
  67. STREG   %r21, TASK_PT_GR21(%r1)         /* 5th argument */
  68. STREG   %r22, TASK_PT_GR22(%r1)         /* syscall # */
  69. STREG %r23, TASK_PT_GR23(%r1) /* 4th argument */
  70. STREG %r24, TASK_PT_GR24(%r1) /* 3rd argument */
  71. STREG %r25, TASK_PT_GR25(%r1) /* 2nd argument */
  72. STREG %r26, TASK_PT_GR26(%r1)   /* 1st argument */
  73. STREG %r27, TASK_PT_GR27(%r1) /* user dp */
  74. STREG   %r28, TASK_PT_GR28(%r1)         /* return value 0 */
  75. STREG   %r28, TASK_PT_ORIG_R28(%r1)     /* return value 0 (saved for signals) */
  76. STREG   %r29, TASK_PT_GR29(%r1)         /* 8th argument */
  77. STREG %r31, TASK_PT_GR31(%r1) /* preserve syscall return ptr */
  78. ldo TASK_PT_FR0(%r1), %r27 /* save fpregs from the kernel */
  79. save_fp %r27 /* or potential task switch  */
  80. mfctl %cr11, %r27 /* i.e. SAR */
  81. STREG %r27, TASK_PT_SAR(%r1)
  82. loadgp
  83. stw %r21, -52(%r30) ;! 5th argument
  84. stw %r20, -56(%r30) ;! 6th argument
  85. stw %r19, -60(%r30) ;! 7th argument
  86. stw     %r29, -64(%r30)                 ;! 8th argument
  87. ldil L%hpux_call_table, %r21
  88. ldo R%hpux_call_table(%r21), %r21
  89. comiclr,>>= __NR_HPUX_syscalls, %r22, %r0
  90. b,n syscall_nosys
  91. ldwx,s %r22(%r21), %r21
  92. ldil L%hpux_syscall_exit,%r2
  93. be 0(%sr7,%r21)
  94. ldo R%hpux_syscall_exit(%r2),%r2
  95. syscall_nosys:
  96. ldil L%hpux_syscall_exit,%r1
  97. be R%hpux_syscall_exit(%sr7,%r1)
  98. ldo -ENOSYS(%r0),%r28
  99. .align 4096
  100. .export end_hpux_gateway_page
  101. end_hpux_gateway_page: