segment.h 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. #ifndef _M68K_SEGMENT_H
  3. #define _M68K_SEGMENT_H
  4. /* define constants */
  5. /* Address spaces (FC0-FC2) */
  6. #define USER_DATA (1)
  7. #ifndef __USER_DS
  8. #define __USER_DS (USER_DATA)
  9. #endif
  10. #define USER_PROGRAM (2)
  11. #define SUPER_DATA (5)
  12. #ifndef __KERNEL_DS
  13. #define __KERNEL_DS (SUPER_DATA)
  14. #endif
  15. #define SUPER_PROGRAM (6)
  16. #define CPU_SPACE (7)
  17. #ifndef __ASSEMBLY__
  18. typedef struct {
  19. unsigned long seg;
  20. } mm_segment_t;
  21. #define MAKE_MM_SEG(s) ((mm_segment_t) { (s) })
  22. #ifdef CONFIG_CPU_HAS_ADDRESS_SPACES
  23. /*
  24. * Get/set the SFC/DFC registers for MOVES instructions
  25. */
  26. #define USER_DS MAKE_MM_SEG(__USER_DS)
  27. #define KERNEL_DS MAKE_MM_SEG(__KERNEL_DS)
  28. static inline mm_segment_t get_fs(void)
  29. {
  30. mm_segment_t _v;
  31. __asm__ ("movec %/dfc,%0":"=r" (_v.seg):);
  32. return _v;
  33. }
  34. static inline void set_fs(mm_segment_t val)
  35. {
  36. __asm__ __volatile__ ("movec %0,%/sfc\n\t"
  37. "movec %0,%/dfc\n\t"
  38. : /* no outputs */ : "r" (val.seg) : "memory");
  39. }
  40. static inline mm_segment_t get_ds(void)
  41. {
  42. /* return the supervisor data space code */
  43. return KERNEL_DS;
  44. }
  45. #else
  46. #define USER_DS MAKE_MM_SEG(TASK_SIZE)
  47. #define KERNEL_DS MAKE_MM_SEG(0xFFFFFFFF)
  48. #define get_ds() (KERNEL_DS)
  49. #define get_fs() (current_thread_info()->addr_limit)
  50. #define set_fs(x) (current_thread_info()->addr_limit = (x))
  51. #endif
  52. #define segment_eq(a, b) ((a).seg == (b).seg)
  53. #endif /* __ASSEMBLY__ */
  54. #endif /* _M68K_SEGMENT_H */