hc
2023-12-06 08f87f769b595151be1afeff53e144f543faa614
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
/*
 * 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