/* 
 | 
 * Copyright (C) 2004 Fujitsu Siemens Computers GmbH 
 | 
 * Licensed under the GPL 
 | 
 * 
 | 
 * Author: Bodo Stroesser <bstroesser@fujitsu-siemens.com> 
 | 
 */ 
 | 
  
 | 
#ifndef __ASM_LDT_H 
 | 
#define __ASM_LDT_H 
 | 
  
 | 
#include <linux/mutex.h> 
 | 
#include <asm/ldt.h> 
 | 
  
 | 
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; 
 | 
  
 | 
#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)) 
 | 
#else 
 | 
#define LDT_empty(info) (_LDT_empty(info)) 
 | 
#endif 
 | 
  
 | 
struct uml_arch_mm_context { 
 | 
    uml_ldt_t ldt; 
 | 
}; 
 | 
  
 | 
#endif 
 |