2005-11-07 11:58:55 +03:00
/*
* Copyright ( C ) 2004 Fujitsu Siemens Computers GmbH
* Licensed under the GPL
*
* Author : Bodo Stroesser < bstroesser @ fujitsu - siemens . com >
*/
# ifndef __ASM_LDT_I386_H
# define __ASM_LDT_I386_H
# include "asm/semaphore.h"
# include "asm/arch/ldt.h"
struct mmu_context_skas ;
extern void ldt_host_info ( void ) ;
extern long init_new_ldt ( struct mmu_context_skas * to_mm ,
struct mmu_context_skas * from_mm ) ;
extern void free_ldt ( struct mmu_context_skas * mm ) ;
# 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 semaphore semaphore ;
union {
struct ldt_entry * pages [ LDT_PAGES_MAX ] ;
struct ldt_entry entries [ LDT_DIRECT_ENTRIES ] ;
2005-11-22 08:32:08 +03:00
} u ;
2005-11-07 11:58:55 +03:00
} uml_ldt_t ;
/*
* macros stolen from include / asm - i386 / desc . h
*/
# 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 )
# endif