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