xref: /OK3568_Linux_fs/kernel/arch/x86/um/asm/mm_context.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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