processor-generic.h 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. /*
  2. * Copyright (C) 2000, 2001, 2002 Jeff Dike (jdike@karaya.com)
  3. * Licensed under the GPL
  4. */
  5. #ifndef __UM_PROCESSOR_GENERIC_H
  6. #define __UM_PROCESSOR_GENERIC_H
  7. struct pt_regs;
  8. struct task_struct;
  9. #include "linux/config.h"
  10. #include "asm/ptrace.h"
  11. #include "choose-mode.h"
  12. #include "registers.h"
  13. struct mm_struct;
  14. struct thread_struct {
  15. /* This flag is set to 1 before calling do_fork (and analyzed in
  16. * copy_thread) to mark that we are begin called from userspace (fork /
  17. * vfork / clone), and reset to 0 after. It is left to 0 when called
  18. * from kernelspace (i.e. kernel_thread() or fork_idle(), as of 2.6.11). */
  19. struct task_struct *saved_task;
  20. int forking;
  21. int nsyscalls;
  22. struct pt_regs regs;
  23. int singlestep_syscall;
  24. void *fault_addr;
  25. void *fault_catcher;
  26. struct task_struct *prev_sched;
  27. unsigned long temp_stack;
  28. void *exec_buf;
  29. struct arch_thread arch;
  30. union {
  31. #ifdef CONFIG_MODE_TT
  32. struct {
  33. int extern_pid;
  34. int tracing;
  35. int switch_pipe[2];
  36. int vm_seq;
  37. } tt;
  38. #endif
  39. #ifdef CONFIG_MODE_SKAS
  40. struct {
  41. void *switch_buf;
  42. void *fork_buf;
  43. int mm_count;
  44. } skas;
  45. #endif
  46. } mode;
  47. struct {
  48. int op;
  49. union {
  50. struct {
  51. int pid;
  52. } fork, exec;
  53. struct {
  54. int (*proc)(void *);
  55. void *arg;
  56. } thread;
  57. struct {
  58. void (*proc)(void *);
  59. void *arg;
  60. } cb;
  61. } u;
  62. } request;
  63. };
  64. #define INIT_THREAD \
  65. { \
  66. .forking = 0, \
  67. .nsyscalls = 0, \
  68. .regs = EMPTY_REGS, \
  69. .fault_addr = NULL, \
  70. .prev_sched = NULL, \
  71. .temp_stack = 0, \
  72. .exec_buf = NULL, \
  73. .arch = INIT_ARCH_THREAD, \
  74. .request = { 0 } \
  75. }
  76. typedef struct {
  77. unsigned long seg;
  78. } mm_segment_t;
  79. extern struct task_struct *alloc_task_struct(void);
  80. extern void release_thread(struct task_struct *);
  81. extern int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags);
  82. extern void dump_thread(struct pt_regs *regs, struct user *u);
  83. static inline void prepare_to_copy(struct task_struct *tsk)
  84. {
  85. }
  86. extern unsigned long thread_saved_pc(struct task_struct *t);
  87. static inline void mm_copy_segments(struct mm_struct *from_mm,
  88. struct mm_struct *new_mm)
  89. {
  90. }
  91. #define init_stack (init_thread_union.stack)
  92. /*
  93. * User space process size: 3GB (default).
  94. */
  95. extern unsigned long task_size;
  96. #define TASK_SIZE (task_size)
  97. /* This decides where the kernel will search for a free chunk of vm
  98. * space during mmap's.
  99. */
  100. #define TASK_UNMAPPED_BASE (0x40000000)
  101. extern void start_thread(struct pt_regs *regs, unsigned long entry,
  102. unsigned long stack);
  103. struct cpuinfo_um {
  104. unsigned long loops_per_jiffy;
  105. int ipi_pipe[2];
  106. };
  107. extern struct cpuinfo_um boot_cpu_data;
  108. #define my_cpu_data cpu_data[smp_processor_id()]
  109. #ifdef CONFIG_SMP
  110. extern struct cpuinfo_um cpu_data[];
  111. #define current_cpu_data cpu_data[smp_processor_id()]
  112. #else
  113. #define cpu_data (&boot_cpu_data)
  114. #define current_cpu_data boot_cpu_data
  115. #endif
  116. #ifdef CONFIG_MODE_SKAS
  117. #define KSTK_REG(tsk, reg) \
  118. ({ union uml_pt_regs regs; \
  119. get_thread_regs(&regs, tsk->thread.mode.skas.switch_buf); \
  120. UPT_REG(&regs, reg); })
  121. #else
  122. #define KSTK_REG(tsk, reg) (0xbadbabe)
  123. #endif
  124. #define get_wchan(p) (0)
  125. #endif