mach_kernel.c 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. #include <glue/gnulinux.h>
  2. #include <linux/printk.h>
  3. #include <linux/uaccess.h>
  4. #include <mach/kern_return.h>
  5. #include <kern/ipc_host.h>
  6. #include <kern/slab.h>
  7. #include <vm/vm_map.h>
  8. #include <vm/vm_kern.h>
  9. #include <ipc/ipc_entry.h>
  10. #include <ipc/ipc_space.h>
  11. #include <ipc/ipc_object.h>
  12. #include <ipc/ipc_port.h>
  13. #include <ipc/ipc_pset.h>
  14. #include <ipc/ipc_marequest.h>
  15. #include <ipc/ipc_notify.h>
  16. #include <ipc/ipc_kmsg.h>
  17. #include <ipc/ipc_init.h>
  18. #include <mach/mach_kernel.h>
  19. #include <glue/mklinux.h>
  20. #define COPYINARGS(type) \
  21. struct type args; \
  22. if (copy_from_user(&args, (struct atype*)arg, sizeof(args))) \
  23. return KERN_FAILURE;
  24. int mach_kernel_init(void)
  25. {
  26. printk(KERN_ERR "mach_kernel_init TODO\n");
  27. return 0;
  28. }
  29. long gnu_mach_get_api_version(void* arg)
  30. {
  31. printk(KERN_DEBUG "mach_get_api_version\n");
  32. return GNU_MACH_API_VERSION;
  33. }
  34. int mach_task_self(void);
  35. long gnu_mach_task_self(void* arg)
  36. {
  37. return (long)mach_task_self();;
  38. }
  39. typedef long (*trap_handler)(void* arg);
  40. struct trap_entry {
  41. trap_handler handler;
  42. const char* name;
  43. };
  44. #define TRAP(impl) [NR_##impl] = { (trap_handler) gnu_##impl, #impl }
  45. static const struct trap_entry mach_traps[80] = {
  46. TRAP(mach_get_api_version),
  47. TRAP(mach_task_self),
  48. TRAP(mach_port_allocate),
  49. TRAP(mach_msg),
  50. };
  51. int mach_kernel_trap(int cmd,long arg)
  52. {
  53. const unsigned int num_traps = sizeof(mach_traps) / sizeof(mach_traps[0]);
  54. const struct trap_entry* entry;
  55. if (cmd >= num_traps)
  56. {
  57. return KERN_FAILURE;
  58. }
  59. entry = &mach_traps[cmd];
  60. if (!entry->handler)
  61. {
  62. return KERN_FAILURE;
  63. }
  64. if(cmd>0) gnumach_thread_update();
  65. return entry->handler(arg);
  66. }
  67. //TODO -- move this to mach_api_internal.h
  68. kern_return_t mach_port_allocate
  69. (ipc_space_t task,
  70. mach_port_right_t right,
  71. mach_port_t *name);
  72. long gnu_mach_port_allocate(void* arg)
  73. {
  74. kern_return_t kr = 0;
  75. COPYINARGS(mach_port_allocate_args);
  76. mach_port_t name=0;
  77. task_t task= current_task();
  78. kr = mach_port_allocate(task->itk_space,args.right,&name);
  79. if(kr==KERN_SUCCESS)
  80. {
  81. if(copy_to_user(args.name,&name,sizeof(name))!=0) kr=KERN_FAILURE;
  82. }
  83. return kr;
  84. }
  85. mach_msg_return_t
  86. mach_msg_trap(
  87. mach_msg_header_t *msg,
  88. mach_msg_option_t option,
  89. mach_msg_size_t send_size,
  90. mach_msg_size_t rcv_size,
  91. mach_port_t rcv_name,
  92. mach_msg_timeout_t time_out,
  93. mach_port_t notify);
  94. long gnu_mach_msg(void* arg)
  95. {
  96. kern_return_t kr = 0;
  97. COPYINARGS(mach_msg_args);
  98. return mach_msg_trap(args.msg,args.option,args.send_size,args.rcv_size,args.rcv_name,args.timeout,args.notify);
  99. }