system.h 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. #ifndef _ASM_X86_SYSTEM_H_
  2. #define _ASM_X86_SYSTEM_H_
  3. #include <asm/asm.h>
  4. #ifdef CONFIG_X86_32
  5. # include "system_32.h"
  6. #else
  7. # include "system_64.h"
  8. #endif
  9. #ifdef __KERNEL__
  10. #define _set_base(addr, base) do { unsigned long __pr; \
  11. __asm__ __volatile__ ("movw %%dx,%1\n\t" \
  12. "rorl $16,%%edx\n\t" \
  13. "movb %%dl,%2\n\t" \
  14. "movb %%dh,%3" \
  15. :"=&d" (__pr) \
  16. :"m" (*((addr)+2)), \
  17. "m" (*((addr)+4)), \
  18. "m" (*((addr)+7)), \
  19. "0" (base) \
  20. ); } while (0)
  21. #define _set_limit(addr, limit) do { unsigned long __lr; \
  22. __asm__ __volatile__ ("movw %%dx,%1\n\t" \
  23. "rorl $16,%%edx\n\t" \
  24. "movb %2,%%dh\n\t" \
  25. "andb $0xf0,%%dh\n\t" \
  26. "orb %%dh,%%dl\n\t" \
  27. "movb %%dl,%2" \
  28. :"=&d" (__lr) \
  29. :"m" (*(addr)), \
  30. "m" (*((addr)+6)), \
  31. "0" (limit) \
  32. ); } while (0)
  33. #define set_base(ldt, base) _set_base(((char *)&(ldt)) , (base))
  34. #define set_limit(ldt, limit) _set_limit(((char *)&(ldt)) , ((limit)-1))
  35. /*
  36. * Save a segment register away
  37. */
  38. #define savesegment(seg, value) \
  39. asm volatile("mov %%" #seg ",%0":"=rm" (value))
  40. static inline unsigned long get_limit(unsigned long segment)
  41. {
  42. unsigned long __limit;
  43. __asm__("lsll %1,%0"
  44. :"=r" (__limit):"r" (segment));
  45. return __limit+1;
  46. }
  47. #endif /* __KERNEL__ */
  48. static inline void clflush(void *__p)
  49. {
  50. asm volatile("clflush %0" : "+m" (*(char __force *)__p));
  51. }
  52. #define nop() __asm__ __volatile__ ("nop")
  53. void disable_hlt(void);
  54. void enable_hlt(void);
  55. extern int es7000_plat;
  56. void cpu_idle_wait(void);
  57. extern unsigned long arch_align_stack(unsigned long sp);
  58. extern void free_init_pages(char *what, unsigned long begin, unsigned long end);
  59. void default_idle(void);
  60. #endif