|
@@ -34,17 +34,43 @@ static inline struct desc_struct FPU_get_ldt_descriptor(unsigned seg)
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
-#define SEG_D_SIZE(x) ((x).b & (3 << 21))
|
|
|
-#define SEG_G_BIT(x) ((x).b & (1 << 23))
|
|
|
-#define SEG_GRANULARITY(x) (((x).b & (1 << 23)) ? 4096 : 1)
|
|
|
-#define SEG_286_MODE(x) ((x).b & ( 0xff000000 | 0xf0000 | (1 << 23)))
|
|
|
-#define SEG_BASE_ADDR(s) (((s).b & 0xff000000) \
|
|
|
- | (((s).b & 0xff) << 16) | ((s).a >> 16))
|
|
|
-#define SEG_LIMIT(s) (((s).b & 0xff0000) | ((s).a & 0xffff))
|
|
|
-#define SEG_EXECUTE_ONLY(s) (((s).b & ((1 << 11) | (1 << 9))) == (1 << 11))
|
|
|
-#define SEG_WRITE_PERM(s) (((s).b & ((1 << 11) | (1 << 9))) == (1 << 9))
|
|
|
-#define SEG_EXPAND_DOWN(s) (((s).b & ((1 << 11) | (1 << 10))) \
|
|
|
- == (1 << 10))
|
|
|
+#define SEG_TYPE_WRITABLE (1U << 1)
|
|
|
+#define SEG_TYPE_EXPANDS_DOWN (1U << 2)
|
|
|
+#define SEG_TYPE_EXECUTE (1U << 3)
|
|
|
+#define SEG_TYPE_EXPAND_MASK (SEG_TYPE_EXPANDS_DOWN | SEG_TYPE_EXECUTE)
|
|
|
+#define SEG_TYPE_EXECUTE_MASK (SEG_TYPE_WRITABLE | SEG_TYPE_EXECUTE)
|
|
|
+
|
|
|
+static inline unsigned long seg_get_base(struct desc_struct *d)
|
|
|
+{
|
|
|
+ unsigned long base = (unsigned long)d->base2 << 24;
|
|
|
+
|
|
|
+ return base | ((unsigned long)d->base1 << 16) | d->base0;
|
|
|
+}
|
|
|
+
|
|
|
+static inline unsigned long seg_get_limit(struct desc_struct *d)
|
|
|
+{
|
|
|
+ return ((unsigned long)d->limit << 16) | d->limit0;
|
|
|
+}
|
|
|
+
|
|
|
+static inline unsigned long seg_get_granularity(struct desc_struct *d)
|
|
|
+{
|
|
|
+ return d->g ? 4096 : 1;
|
|
|
+}
|
|
|
+
|
|
|
+static inline bool seg_expands_down(struct desc_struct *d)
|
|
|
+{
|
|
|
+ return (d->type & SEG_TYPE_EXPAND_MASK) == SEG_TYPE_EXPANDS_DOWN;
|
|
|
+}
|
|
|
+
|
|
|
+static inline bool seg_execute_only(struct desc_struct *d)
|
|
|
+{
|
|
|
+ return (d->type & SEG_TYPE_EXECUTE_MASK) == SEG_TYPE_EXECUTE;
|
|
|
+}
|
|
|
+
|
|
|
+static inline bool seg_writable(struct desc_struct *d)
|
|
|
+{
|
|
|
+ return (d->type & SEG_TYPE_EXECUTE_MASK) == SEG_TYPE_WRITABLE;
|
|
|
+}
|
|
|
|
|
|
#define I387 (¤t->thread.fpu.state)
|
|
|
#define FPU_info (I387->soft.info)
|