162306a36Sopenharmony_ci/*
262306a36Sopenharmony_ci * Copyright (C) 2004 Fujitsu Siemens Computers GmbH
362306a36Sopenharmony_ci * Licensed under the GPL
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Author: Bodo Stroesser <bstroesser@fujitsu-siemens.com>
662306a36Sopenharmony_ci */
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#ifndef __ASM_LDT_H
962306a36Sopenharmony_ci#define __ASM_LDT_H
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci#include <linux/mutex.h>
1262306a36Sopenharmony_ci#include <asm/ldt.h>
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci#define LDT_PAGES_MAX \
1562306a36Sopenharmony_ci	((LDT_ENTRIES * LDT_ENTRY_SIZE)/PAGE_SIZE)
1662306a36Sopenharmony_ci#define LDT_ENTRIES_PER_PAGE \
1762306a36Sopenharmony_ci	(PAGE_SIZE/LDT_ENTRY_SIZE)
1862306a36Sopenharmony_ci#define LDT_DIRECT_ENTRIES \
1962306a36Sopenharmony_ci	((LDT_PAGES_MAX*sizeof(void *))/LDT_ENTRY_SIZE)
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_cistruct ldt_entry {
2262306a36Sopenharmony_ci	__u32 a;
2362306a36Sopenharmony_ci	__u32 b;
2462306a36Sopenharmony_ci};
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_citypedef struct uml_ldt {
2762306a36Sopenharmony_ci	int entry_count;
2862306a36Sopenharmony_ci	struct mutex lock;
2962306a36Sopenharmony_ci	union {
3062306a36Sopenharmony_ci		struct ldt_entry * pages[LDT_PAGES_MAX];
3162306a36Sopenharmony_ci		struct ldt_entry entries[LDT_DIRECT_ENTRIES];
3262306a36Sopenharmony_ci	} u;
3362306a36Sopenharmony_ci} uml_ldt_t;
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_ci#define LDT_entry_a(info) \
3662306a36Sopenharmony_ci	((((info)->base_addr & 0x0000ffff) << 16) | ((info)->limit & 0x0ffff))
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ci#define LDT_entry_b(info) \
3962306a36Sopenharmony_ci	(((info)->base_addr & 0xff000000) | \
4062306a36Sopenharmony_ci	(((info)->base_addr & 0x00ff0000) >> 16) | \
4162306a36Sopenharmony_ci	((info)->limit & 0xf0000) | \
4262306a36Sopenharmony_ci	(((info)->read_exec_only ^ 1) << 9) | \
4362306a36Sopenharmony_ci	((info)->contents << 10) | \
4462306a36Sopenharmony_ci	(((info)->seg_not_present ^ 1) << 15) | \
4562306a36Sopenharmony_ci	((info)->seg_32bit << 22) | \
4662306a36Sopenharmony_ci	((info)->limit_in_pages << 23) | \
4762306a36Sopenharmony_ci	((info)->useable << 20) | \
4862306a36Sopenharmony_ci	0x7000)
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_ci#define _LDT_empty(info) (\
5162306a36Sopenharmony_ci	(info)->base_addr	== 0	&& \
5262306a36Sopenharmony_ci	(info)->limit		== 0	&& \
5362306a36Sopenharmony_ci	(info)->contents	== 0	&& \
5462306a36Sopenharmony_ci	(info)->read_exec_only	== 1	&& \
5562306a36Sopenharmony_ci	(info)->seg_32bit	== 0	&& \
5662306a36Sopenharmony_ci	(info)->limit_in_pages	== 0	&& \
5762306a36Sopenharmony_ci	(info)->seg_not_present	== 1	&& \
5862306a36Sopenharmony_ci	(info)->useable		== 0	)
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_ci#ifdef CONFIG_X86_64
6162306a36Sopenharmony_ci#define LDT_empty(info) (_LDT_empty(info) && ((info)->lm == 0))
6262306a36Sopenharmony_ci#else
6362306a36Sopenharmony_ci#define LDT_empty(info) (_LDT_empty(info))
6462306a36Sopenharmony_ci#endif
6562306a36Sopenharmony_ci
6662306a36Sopenharmony_cistruct uml_arch_mm_context {
6762306a36Sopenharmony_ci	uml_ldt_t ldt;
6862306a36Sopenharmony_ci};
6962306a36Sopenharmony_ci
7062306a36Sopenharmony_ci#endif
71