1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * Copyright (C) 2004 Fujitsu Siemens Computers GmbH 3*4882a593Smuzhiyun * Licensed under the GPL 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Author: Bodo Stroesser <bstroesser@fujitsu-siemens.com> 6*4882a593Smuzhiyun */ 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun #ifndef __ASM_LDT_H 9*4882a593Smuzhiyun #define __ASM_LDT_H 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun #include <linux/mutex.h> 12*4882a593Smuzhiyun #include <asm/ldt.h> 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun extern void ldt_host_info(void); 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun #define LDT_PAGES_MAX \ 17*4882a593Smuzhiyun ((LDT_ENTRIES * LDT_ENTRY_SIZE)/PAGE_SIZE) 18*4882a593Smuzhiyun #define LDT_ENTRIES_PER_PAGE \ 19*4882a593Smuzhiyun (PAGE_SIZE/LDT_ENTRY_SIZE) 20*4882a593Smuzhiyun #define LDT_DIRECT_ENTRIES \ 21*4882a593Smuzhiyun ((LDT_PAGES_MAX*sizeof(void *))/LDT_ENTRY_SIZE) 22*4882a593Smuzhiyun 23*4882a593Smuzhiyun struct ldt_entry { 24*4882a593Smuzhiyun __u32 a; 25*4882a593Smuzhiyun __u32 b; 26*4882a593Smuzhiyun }; 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun typedef struct uml_ldt { 29*4882a593Smuzhiyun int entry_count; 30*4882a593Smuzhiyun struct mutex lock; 31*4882a593Smuzhiyun union { 32*4882a593Smuzhiyun struct ldt_entry * pages[LDT_PAGES_MAX]; 33*4882a593Smuzhiyun struct ldt_entry entries[LDT_DIRECT_ENTRIES]; 34*4882a593Smuzhiyun } u; 35*4882a593Smuzhiyun } uml_ldt_t; 36*4882a593Smuzhiyun 37*4882a593Smuzhiyun #define LDT_entry_a(info) \ 38*4882a593Smuzhiyun ((((info)->base_addr & 0x0000ffff) << 16) | ((info)->limit & 0x0ffff)) 39*4882a593Smuzhiyun 40*4882a593Smuzhiyun #define LDT_entry_b(info) \ 41*4882a593Smuzhiyun (((info)->base_addr & 0xff000000) | \ 42*4882a593Smuzhiyun (((info)->base_addr & 0x00ff0000) >> 16) | \ 43*4882a593Smuzhiyun ((info)->limit & 0xf0000) | \ 44*4882a593Smuzhiyun (((info)->read_exec_only ^ 1) << 9) | \ 45*4882a593Smuzhiyun ((info)->contents << 10) | \ 46*4882a593Smuzhiyun (((info)->seg_not_present ^ 1) << 15) | \ 47*4882a593Smuzhiyun ((info)->seg_32bit << 22) | \ 48*4882a593Smuzhiyun ((info)->limit_in_pages << 23) | \ 49*4882a593Smuzhiyun ((info)->useable << 20) | \ 50*4882a593Smuzhiyun 0x7000) 51*4882a593Smuzhiyun 52*4882a593Smuzhiyun #define _LDT_empty(info) (\ 53*4882a593Smuzhiyun (info)->base_addr == 0 && \ 54*4882a593Smuzhiyun (info)->limit == 0 && \ 55*4882a593Smuzhiyun (info)->contents == 0 && \ 56*4882a593Smuzhiyun (info)->read_exec_only == 1 && \ 57*4882a593Smuzhiyun (info)->seg_32bit == 0 && \ 58*4882a593Smuzhiyun (info)->limit_in_pages == 0 && \ 59*4882a593Smuzhiyun (info)->seg_not_present == 1 && \ 60*4882a593Smuzhiyun (info)->useable == 0 ) 61*4882a593Smuzhiyun 62*4882a593Smuzhiyun #ifdef CONFIG_X86_64 63*4882a593Smuzhiyun #define LDT_empty(info) (_LDT_empty(info) && ((info)->lm == 0)) 64*4882a593Smuzhiyun #else 65*4882a593Smuzhiyun #define LDT_empty(info) (_LDT_empty(info)) 66*4882a593Smuzhiyun #endif 67*4882a593Smuzhiyun 68*4882a593Smuzhiyun struct uml_arch_mm_context { 69*4882a593Smuzhiyun uml_ldt_t ldt; 70*4882a593Smuzhiyun }; 71*4882a593Smuzhiyun 72*4882a593Smuzhiyun #endif 73