]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/i386/include/vm86.h
i386: Do not ever store to other-CPU counter64 slot.
[FreeBSD/FreeBSD.git] / sys / i386 / include / vm86.h
1 /*-
2  * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
3  *
4  * Copyright (c) 1997 Jonathan Lemon
5  * All rights reserved.
6  *
7  * Derived from register.h, which is
8  *     Copyright (c) 1996 Michael Smith.  All rights reserved.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice, this list of conditions and the following disclaimer.
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
20  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
23  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29  * SUCH DAMAGE.
30  *
31  * $FreeBSD$
32  */
33
34 #ifndef _MACHINE_VM86_H_
35 #define _MACHINE_VM86_H_ 1
36
37 /* standard register representation */
38 typedef union {
39         u_int   r_ex;
40         struct {
41                 u_short r_x;
42                 u_int   :16;
43         } r_w;
44         struct {
45                 u_char  r_l;
46                 u_char  r_h;
47                 u_int   :16;
48         } r_b;
49 } reg86_t;
50
51 /* layout must match definition of struct trapframe_vm86 in <machine/frame.h> */
52
53 struct vm86frame {
54         int     kernel_fs;
55         int     kernel_es;
56         int     kernel_ds;
57         reg86_t edi;
58         reg86_t esi;
59         reg86_t ebp;
60         reg86_t isp;
61         reg86_t ebx;
62         reg86_t edx;
63         reg86_t ecx;
64         reg86_t eax;
65         int     vmf_trapno;
66         int     vmf_err;
67         reg86_t eip;
68         reg86_t cs;
69         reg86_t eflags;
70         reg86_t esp;
71         reg86_t ss;
72         reg86_t es;
73         reg86_t ds;
74         reg86_t fs;
75         reg86_t gs;
76 #define vmf_ah          eax.r_b.r_h
77 #define vmf_al          eax.r_b.r_l
78 #define vmf_ax          eax.r_w.r_x
79 #define vmf_eax         eax.r_ex
80 #define vmf_bh          ebx.r_b.r_h
81 #define vmf_bl          ebx.r_b.r_l
82 #define vmf_bx          ebx.r_w.r_x
83 #define vmf_ebx         ebx.r_ex
84 #define vmf_ch          ecx.r_b.r_h
85 #define vmf_cl          ecx.r_b.r_l
86 #define vmf_cx          ecx.r_w.r_x
87 #define vmf_ecx         ecx.r_ex
88 #define vmf_dh          edx.r_b.r_h
89 #define vmf_dl          edx.r_b.r_l
90 #define vmf_dx          edx.r_w.r_x
91 #define vmf_edx         edx.r_ex
92 #define vmf_si          esi.r_w.r_x
93 #define vmf_di          edi.r_w.r_x
94 #define vmf_cs          cs.r_w.r_x
95 #define vmf_ds          ds.r_w.r_x
96 #define vmf_es          es.r_w.r_x
97 #define vmf_ss          ss.r_w.r_x
98 #define vmf_bp          ebp.r_w.r_x
99 #define vmf_sp          esp.r_w.r_x
100 #define vmf_ip          eip.r_w.r_x
101 #define vmf_flags       eflags.r_w.r_x
102 #define vmf_eflags      eflags.r_ex
103 };
104
105 #define VM86_PMAPSIZE   24
106 #define VMAP_MALLOC     1       /* page was malloced by us */
107
108 struct vm86context {
109         int     npages;
110         struct  vm86pmap {
111                 int     flags;
112                 int     pte_num;
113                 vm_offset_t     kva;
114                 uint64_t        old_pte;
115         } pmap[VM86_PMAPSIZE];
116 };
117
118 #define VM_USERCHANGE   (PSL_USERCHANGE)
119 #define VME_USERCHANGE  (VM_USERCHANGE | PSL_VIP | PSL_VIF)
120
121 struct vm86_kernel {
122         caddr_t vm86_intmap;                    /* interrupt map */
123         u_int   vm86_eflags;                    /* emulated flags */
124         int     vm86_has_vme;                   /* VME support */
125         int     vm86_inited;                    /* we were initialized */
126         int     vm86_debug;
127         caddr_t vm86_sproc;                     /* address of sproc */
128 };
129
130 #define VM86_INIT       1
131 #define VM86_SET_VME    2
132 #define VM86_GET_VME    3
133 #define VM86_INTCALL    4
134
135 struct vm86_init_args {
136         int     debug;                  /* debug flag */
137         int     cpu_type;               /* cpu type to emulate */
138         u_char  int_map[32];            /* interrupt map */ 
139 };
140
141 struct vm86_vme_args {
142         int     state;                  /* status */
143 };
144
145 struct vm86_intcall_args {
146         int     intnum;
147         struct  vm86frame vmf;
148 };
149
150 #ifdef _KERNEL
151 extern  int vm86paddr;
152
153 struct thread;
154 extern  int vm86_emulate(struct vm86frame *);
155 extern  int vm86_sysarch(struct thread *, char *);
156 extern void vm86_trap(struct vm86frame *);
157 extern  int vm86_intcall(int, struct vm86frame *);
158 extern  int vm86_datacall(int, struct vm86frame *, struct vm86context *);
159 extern void vm86_initialize(void);
160 extern vm_offset_t vm86_getpage(struct vm86context *, int);
161 extern vm_offset_t vm86_addpage(struct vm86context *, int, vm_offset_t);
162 extern int vm86_getptr(struct vm86context *, vm_offset_t, u_short *, u_short *);
163
164 extern vm_offset_t vm86_getaddr(struct vm86context *, u_short, u_short);
165 #endif /* _KERNEL */
166
167 #endif /* _MACHINE_VM86_H_ */