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 extern void ldt_host_info(void); 15 *b3ee571eSAl Viro 16 *b3ee571eSAl Viro #define LDT_PAGES_MAX \ 17 *b3ee571eSAl Viro ((LDT_ENTRIES * LDT_ENTRY_SIZE)/PAGE_SIZE) 18 *b3ee571eSAl Viro #define LDT_ENTRIES_PER_PAGE \ 19 *b3ee571eSAl Viro (PAGE_SIZE/LDT_ENTRY_SIZE) 20 *b3ee571eSAl Viro #define LDT_DIRECT_ENTRIES \ 21 *b3ee571eSAl Viro ((LDT_PAGES_MAX*sizeof(void *))/LDT_ENTRY_SIZE) 22 *b3ee571eSAl Viro 23 *b3ee571eSAl Viro struct ldt_entry { 24 *b3ee571eSAl Viro __u32 a; 25 *b3ee571eSAl Viro __u32 b; 26 *b3ee571eSAl Viro }; 27 *b3ee571eSAl Viro 28 *b3ee571eSAl Viro typedef struct uml_ldt { 29 *b3ee571eSAl Viro int entry_count; 30 *b3ee571eSAl Viro struct mutex lock; 31 *b3ee571eSAl Viro union { 32 *b3ee571eSAl Viro struct ldt_entry * pages[LDT_PAGES_MAX]; 33 *b3ee571eSAl Viro struct ldt_entry entries[LDT_DIRECT_ENTRIES]; 34 *b3ee571eSAl Viro } u; 35 *b3ee571eSAl Viro } uml_ldt_t; 36 *b3ee571eSAl Viro 37 *b3ee571eSAl Viro #define LDT_entry_a(info) \ 38 *b3ee571eSAl Viro ((((info)->base_addr & 0x0000ffff) << 16) | ((info)->limit & 0x0ffff)) 39 *b3ee571eSAl Viro 40 *b3ee571eSAl Viro #define LDT_entry_b(info) \ 41 *b3ee571eSAl Viro (((info)->base_addr & 0xff000000) | \ 42 *b3ee571eSAl Viro (((info)->base_addr & 0x00ff0000) >> 16) | \ 43 *b3ee571eSAl Viro ((info)->limit & 0xf0000) | \ 44 *b3ee571eSAl Viro (((info)->read_exec_only ^ 1) << 9) | \ 45 *b3ee571eSAl Viro ((info)->contents << 10) | \ 46 *b3ee571eSAl Viro (((info)->seg_not_present ^ 1) << 15) | \ 47 *b3ee571eSAl Viro ((info)->seg_32bit << 22) | \ 48 *b3ee571eSAl Viro ((info)->limit_in_pages << 23) | \ 49 *b3ee571eSAl Viro ((info)->useable << 20) | \ 50 *b3ee571eSAl Viro 0x7000) 51 *b3ee571eSAl Viro 52 *b3ee571eSAl Viro #define _LDT_empty(info) (\ 53 *b3ee571eSAl Viro (info)->base_addr == 0 && \ 54 *b3ee571eSAl Viro (info)->limit == 0 && \ 55 *b3ee571eSAl Viro (info)->contents == 0 && \ 56 *b3ee571eSAl Viro (info)->read_exec_only == 1 && \ 57 *b3ee571eSAl Viro (info)->seg_32bit == 0 && \ 58 *b3ee571eSAl Viro (info)->limit_in_pages == 0 && \ 59 *b3ee571eSAl Viro (info)->seg_not_present == 1 && \ 60 *b3ee571eSAl Viro (info)->useable == 0 ) 61 *b3ee571eSAl Viro 62 *b3ee571eSAl Viro #ifdef CONFIG_X86_64 63 *b3ee571eSAl Viro #define LDT_empty(info) (_LDT_empty(info) && ((info)->lm == 0)) 64 *b3ee571eSAl Viro #else 65 *b3ee571eSAl Viro #define LDT_empty(info) (_LDT_empty(info)) 66 *b3ee571eSAl Viro #endif 67 *b3ee571eSAl Viro 68 *b3ee571eSAl Viro struct uml_arch_mm_context { 69 *b3ee571eSAl Viro uml_ldt_t ldt; 70 *b3ee571eSAl Viro }; 71 *b3ee571eSAl Viro 72 *b3ee571eSAl Viro #endif 73