aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/asm-x86/desc.h58
1 files changed, 18 insertions, 40 deletions
diff --git a/include/asm-x86/desc.h b/include/asm-x86/desc.h
index c31715cf2218..e9356a852020 100644
--- a/include/asm-x86/desc.h
+++ b/include/asm-x86/desc.h
@@ -125,21 +125,6 @@ static inline void native_write_gdt_entry(struct desc_struct *gdt, int entry,
125 memcpy(&gdt[entry], desc, size); 125 memcpy(&gdt[entry], desc, size);
126} 126}
127 127
128static inline void set_tssldt_descriptor(struct ldttss_desc64 *d,
129 unsigned long tss, unsigned type,
130 unsigned size)
131{
132 memset(d, 0, sizeof(*d));
133 d->limit0 = size & 0xFFFF;
134 d->base0 = PTR_LOW(tss);
135 d->base1 = PTR_MIDDLE(tss) & 0xFF;
136 d->type = type;
137 d->p = 1;
138 d->limit1 = (size >> 16) & 0xF;
139 d->base2 = (PTR_MIDDLE(tss) >> 8) & 0xFF;
140 d->base3 = PTR_HIGH(tss);
141}
142
143static inline void pack_descriptor(struct desc_struct *desc, unsigned long base, 128static inline void pack_descriptor(struct desc_struct *desc, unsigned long base,
144 unsigned long limit, unsigned char type, 129 unsigned long limit, unsigned char type,
145 unsigned char flags) 130 unsigned char flags)
@@ -151,30 +136,24 @@ static inline void pack_descriptor(struct desc_struct *desc, unsigned long base,
151 desc->p = 1; 136 desc->p = 1;
152} 137}
153 138
154static inline void pack_ldt(ldt_desc *ldt, unsigned long addr,
155 unsigned size)
156{
157 139
158#ifdef CONFIG_X86_64 140static inline void set_tssldt_descriptor(void *d, unsigned long addr,
159 set_tssldt_descriptor(ldt, 141 unsigned type, unsigned size)
160 addr, DESC_LDT, size);
161#else
162 pack_descriptor(ldt, (unsigned long)addr,
163 size,
164 0x80 | DESC_LDT, 0);
165#endif
166}
167
168static inline void pack_tss(tss_desc *tss, unsigned long addr,
169 unsigned size, unsigned entry)
170{ 142{
171#ifdef CONFIG_X86_64 143#ifdef CONFIG_X86_64
172 set_tssldt_descriptor(tss, 144 struct ldttss_desc64 *desc = d;
173 addr, entry, size); 145 memset(desc, 0, sizeof(*desc));
146 desc->limit0 = size & 0xFFFF;
147 desc->base0 = PTR_LOW(addr);
148 desc->base1 = PTR_MIDDLE(addr) & 0xFF;
149 desc->type = type;
150 desc->p = 1;
151 desc->limit1 = (size >> 16) & 0xF;
152 desc->base2 = (PTR_MIDDLE(addr) >> 8) & 0xFF;
153 desc->base3 = PTR_HIGH(addr);
174#else 154#else
175 pack_descriptor(tss, (unsigned long)addr, 155
176 size, 156 pack_descriptor((struct desc_struct *)d, addr, size, 0x80 | type, 0);
177 0x80 | entry, 0);
178#endif 157#endif
179} 158}
180 159
@@ -190,9 +169,8 @@ static inline void __set_tss_desc(unsigned cpu, unsigned int entry, void *addr)
190 * -1? seg base+limit should be pointing to the address of the 169 * -1? seg base+limit should be pointing to the address of the
191 * last valid byte 170 * last valid byte
192 */ 171 */
193 pack_tss(&tss, (unsigned long)addr, 172 set_tssldt_descriptor(&tss, (unsigned long)addr, DESC_TSS,
194 IO_BITMAP_OFFSET + IO_BITMAP_BYTES + sizeof(unsigned long) - 1, 173 IO_BITMAP_OFFSET + IO_BITMAP_BYTES + sizeof(unsigned long) - 1);
195 DESC_TSS);
196 write_gdt_entry(d, entry, &tss, DESC_TSS); 174 write_gdt_entry(d, entry, &tss, DESC_TSS);
197} 175}
198 176
@@ -206,8 +184,8 @@ static inline void native_set_ldt(const void *addr, unsigned int entries)
206 unsigned cpu = smp_processor_id(); 184 unsigned cpu = smp_processor_id();
207 ldt_desc ldt; 185 ldt_desc ldt;
208 186
209 pack_ldt(&ldt, (unsigned long)addr, 187 set_tssldt_descriptor(&ldt, (unsigned long)addr,
210 entries * sizeof(ldt) - 1); 188 DESC_LDT, entries * sizeof(ldt) - 1);
211 write_gdt_entry(get_cpu_gdt_table(cpu), GDT_ENTRY_LDT, 189 write_gdt_entry(get_cpu_gdt_table(cpu), GDT_ENTRY_LDT,
212 &ldt, DESC_LDT); 190 &ldt, DESC_LDT);
213 __asm__ __volatile__("lldt %w0"::"q" (GDT_ENTRY_LDT*8)); 191 __asm__ __volatile__("lldt %w0"::"q" (GDT_ENTRY_LDT*8));