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

嵌入式Linux

开发平台:

Unix_Linux

  1. /* ------------------------------------------------------------------------------
  2.  *
  3.  * Linux/PARISC Project (http://www.thepuffingroup.com/parisc)
  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. #define __ASSEMBLY__
  11. #include <asm/assembly.h>
  12. #include <asm/offset.h>
  13. #include <asm/unistd.h>
  14. #include <asm/errno.h>
  15. .text
  16. .import hpux_call_table
  17. .import hpux_syscall_exit,code
  18. .export hpux_gateway_page
  19. .align 4096
  20. hpux_gateway_page:
  21. nop
  22. mfsp %sr7,%r1 ;! we must set sr3 to the space
  23. mtsp %r1,%sr3 ;! of the user before the gate
  24. #ifdef __LP64__
  25. #warning NEEDS WORK for 64-bit
  26. #endif
  27. ldw -64(%r30), %r28 ;! 8th argument
  28. ldw -60(%r30), %r19 ;! 7th argument
  29. ldw -56(%r30), %r20 ;! 6th argument
  30. ldw -52(%r30), %r21 ;! 5th argument
  31. gate .+8, %r0 ;! become privileged
  32. mtsp %r0,%sr4 ;! get kernel space into sr4
  33. mtsp %r0,%sr5 ;! get kernel space into sr5
  34. mtsp %r0,%sr6 ;! get kernel space into sr6
  35. mtsp %r0,%sr7 ;! get kernel space into sr7
  36. mfctl %cr30,%r1 ;! get the kernel task ptr
  37. mtctl %r0,%cr30 ;! zero it (flag)
  38. STREG %r30,TASK_PT_GR30(%r1) ;! preserve userspace sp
  39. STREG %r2,TASK_PT_GR2(%r1) ;! preserve rp
  40. STREG %r27,TASK_PT_GR27(%r1) ;! user dp
  41. STREG %r31,TASK_PT_GR31(%r1) ;! preserve syscall return ptr
  42. loadgp ;! setup kernel dp
  43. ldo TASK_SZ_ALGN+64(%r1),%r30 ;! set up kernel stack
  44. stw %r21, -52(%r30) ;! 5th argument
  45. stw %r20, -56(%r30) ;! 6th argument
  46. stw %r19, -60(%r30) ;! 7th argument
  47. stw %r28, -64(%r30) ;! 8th argument
  48. ldil L%hpux_call_table, %r21
  49. ldo R%hpux_call_table(%r21), %r21
  50. comiclr,>>= __NR_HPUX_syscalls, %r22, %r0
  51. b,n syscall_nosys
  52. ldwx,s %r22(%r21), %r21
  53. ldil L%hpux_syscall_exit,%r2
  54. be 0(%sr7,%r21)
  55. ldo R%hpux_syscall_exit(%r2),%r2
  56. syscall_nosys:
  57. ldil L%hpux_syscall_exit,%r1
  58. be R%hpux_syscall_exit(%sr7,%r1)
  59. ldo -ENOSYS(%r0),%r28
  60. .align 4096
  61. .export end_hpux_gateway_page
  62. end_hpux_gateway_page: