| 
									
										
										
										
											2011-08-18 20:10:49 +01:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * Copyright (C) 2004 Fujitsu Siemens Computers GmbH | 
					
						
							|  |  |  |  * Licensed under the GPL | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Author: Bodo Stroesser <bstroesser@fujitsu-siemens.com> | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2011-08-18 20:09:29 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-18 20:10:49 +01:00
										 |  |  | #ifndef __ASM_LDT_H
 | 
					
						
							|  |  |  | #define __ASM_LDT_H
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <linux/mutex.h>
 | 
					
						
							| 
									
										
										
										
											2011-08-18 20:09:29 +01:00
										 |  |  | #include <asm/ldt.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-18 20:10:49 +01:00
										 |  |  | extern void ldt_host_info(void); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define LDT_PAGES_MAX \
 | 
					
						
							|  |  |  | 	((LDT_ENTRIES * LDT_ENTRY_SIZE)/PAGE_SIZE) | 
					
						
							|  |  |  | #define LDT_ENTRIES_PER_PAGE \
 | 
					
						
							|  |  |  | 	(PAGE_SIZE/LDT_ENTRY_SIZE) | 
					
						
							|  |  |  | #define LDT_DIRECT_ENTRIES \
 | 
					
						
							|  |  |  | 	((LDT_PAGES_MAX*sizeof(void *))/LDT_ENTRY_SIZE) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct ldt_entry { | 
					
						
							|  |  |  | 	__u32 a; | 
					
						
							|  |  |  | 	__u32 b; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | typedef struct uml_ldt { | 
					
						
							|  |  |  | 	int entry_count; | 
					
						
							|  |  |  | 	struct mutex lock; | 
					
						
							|  |  |  | 	union { | 
					
						
							|  |  |  | 		struct ldt_entry * pages[LDT_PAGES_MAX]; | 
					
						
							|  |  |  | 		struct ldt_entry entries[LDT_DIRECT_ENTRIES]; | 
					
						
							|  |  |  | 	} u; | 
					
						
							|  |  |  | } uml_ldt_t; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-18 20:09:29 +01:00
										 |  |  | #define LDT_entry_a(info) \
 | 
					
						
							|  |  |  | 	((((info)->base_addr & 0x0000ffff) << 16) | ((info)->limit & 0x0ffff)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define LDT_entry_b(info) \
 | 
					
						
							|  |  |  | 	(((info)->base_addr & 0xff000000) | \ | 
					
						
							|  |  |  | 	(((info)->base_addr & 0x00ff0000) >> 16) | \ | 
					
						
							|  |  |  | 	((info)->limit & 0xf0000) | \ | 
					
						
							|  |  |  | 	(((info)->read_exec_only ^ 1) << 9) | \ | 
					
						
							|  |  |  | 	((info)->contents << 10) | \ | 
					
						
							|  |  |  | 	(((info)->seg_not_present ^ 1) << 15) | \ | 
					
						
							|  |  |  | 	((info)->seg_32bit << 22) | \ | 
					
						
							|  |  |  | 	((info)->limit_in_pages << 23) | \ | 
					
						
							|  |  |  | 	((info)->useable << 20) | \ | 
					
						
							|  |  |  | 	0x7000) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define _LDT_empty(info) (\
 | 
					
						
							|  |  |  | 	(info)->base_addr	== 0	&& \ | 
					
						
							|  |  |  | 	(info)->limit		== 0	&& \ | 
					
						
							|  |  |  | 	(info)->contents	== 0	&& \ | 
					
						
							|  |  |  | 	(info)->read_exec_only	== 1	&& \ | 
					
						
							|  |  |  | 	(info)->seg_32bit	== 0	&& \ | 
					
						
							|  |  |  | 	(info)->limit_in_pages	== 0	&& \ | 
					
						
							|  |  |  | 	(info)->seg_not_present	== 1	&& \ | 
					
						
							|  |  |  | 	(info)->useable		== 0	) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifdef CONFIG_X86_64
 | 
					
						
							|  |  |  | #define LDT_empty(info) (_LDT_empty(info) && ((info)->lm == 0))
 | 
					
						
							| 
									
										
										
										
											2011-08-18 20:03:09 +01:00
										 |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2011-08-18 20:09:29 +01:00
										 |  |  | #define LDT_empty(info) (_LDT_empty(info))
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-18 20:10:49 +01:00
										 |  |  | struct uml_arch_mm_context { | 
					
						
							|  |  |  | 	uml_ldt_t ldt; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-18 20:03:09 +01:00
										 |  |  | #endif
 |