diff options
-rw-r--r-- | arch/i386/kernel/Makefile | 3 | ||||
-rw-r--r-- | arch/i386/kernel/entry.S | 2 | ||||
-rw-r--r-- | arch/i386/kernel/process.c | 1 | ||||
-rw-r--r-- | include/asm-i386/irq.h | 2 | ||||
-rw-r--r-- | include/asm-i386/vm86.h | 20 | ||||
-rw-r--r-- | init/Kconfig | 10 | ||||
-rw-r--r-- | kernel/sys_ni.c | 2 |
7 files changed, 37 insertions, 3 deletions
diff --git a/arch/i386/kernel/Makefile b/arch/i386/kernel/Makefile index 4f40589e179c..be1880bb75b4 100644 --- a/arch/i386/kernel/Makefile +++ b/arch/i386/kernel/Makefile | |||
@@ -4,7 +4,7 @@ | |||
4 | 4 | ||
5 | extra-y := head.o init_task.o vmlinux.lds | 5 | extra-y := head.o init_task.o vmlinux.lds |
6 | 6 | ||
7 | obj-y := process.o semaphore.o signal.o entry.o traps.o irq.o vm86.o \ | 7 | obj-y := process.o semaphore.o signal.o entry.o traps.o irq.o \ |
8 | ptrace.o time.o ioport.o ldt.o setup.o i8259.o sys_i386.o \ | 8 | ptrace.o time.o ioport.o ldt.o setup.o i8259.o sys_i386.o \ |
9 | pci-dma.o i386_ksyms.o i387.o dmi_scan.o bootflag.o \ | 9 | pci-dma.o i386_ksyms.o i387.o dmi_scan.o bootflag.o \ |
10 | quirks.o i8237.o | 10 | quirks.o i8237.o |
@@ -34,6 +34,7 @@ obj-$(CONFIG_ACPI_SRAT) += srat.o | |||
34 | obj-$(CONFIG_HPET_TIMER) += time_hpet.o | 34 | obj-$(CONFIG_HPET_TIMER) += time_hpet.o |
35 | obj-$(CONFIG_EFI) += efi.o efi_stub.o | 35 | obj-$(CONFIG_EFI) += efi.o efi_stub.o |
36 | obj-$(CONFIG_DOUBLEFAULT) += doublefault.o | 36 | obj-$(CONFIG_DOUBLEFAULT) += doublefault.o |
37 | obj-$(CONFIG_VM86) += vm86.o | ||
37 | obj-$(CONFIG_EARLY_PRINTK) += early_printk.o | 38 | obj-$(CONFIG_EARLY_PRINTK) += early_printk.o |
38 | 39 | ||
39 | EXTRA_AFLAGS := -traditional | 40 | EXTRA_AFLAGS := -traditional |
diff --git a/arch/i386/kernel/entry.S b/arch/i386/kernel/entry.S index 607c06007508..4d704724b2f5 100644 --- a/arch/i386/kernel/entry.S +++ b/arch/i386/kernel/entry.S | |||
@@ -323,6 +323,7 @@ work_notifysig: # deal with pending signals and | |||
323 | 323 | ||
324 | ALIGN | 324 | ALIGN |
325 | work_notifysig_v86: | 325 | work_notifysig_v86: |
326 | #ifdef CONFIG_VM86 | ||
326 | pushl %ecx # save ti_flags for do_notify_resume | 327 | pushl %ecx # save ti_flags for do_notify_resume |
327 | call save_v86_state # %eax contains pt_regs pointer | 328 | call save_v86_state # %eax contains pt_regs pointer |
328 | popl %ecx | 329 | popl %ecx |
@@ -330,6 +331,7 @@ work_notifysig_v86: | |||
330 | xorl %edx, %edx | 331 | xorl %edx, %edx |
331 | call do_notify_resume | 332 | call do_notify_resume |
332 | jmp resume_userspace | 333 | jmp resume_userspace |
334 | #endif | ||
333 | 335 | ||
334 | # perform syscall exit tracing | 336 | # perform syscall exit tracing |
335 | ALIGN | 337 | ALIGN |
diff --git a/arch/i386/kernel/process.c b/arch/i386/kernel/process.c index 45e7f0ac4b04..035928f3f6c1 100644 --- a/arch/i386/kernel/process.c +++ b/arch/i386/kernel/process.c | |||
@@ -48,6 +48,7 @@ | |||
48 | #include <asm/processor.h> | 48 | #include <asm/processor.h> |
49 | #include <asm/i387.h> | 49 | #include <asm/i387.h> |
50 | #include <asm/desc.h> | 50 | #include <asm/desc.h> |
51 | #include <asm/vm86.h> | ||
51 | #ifdef CONFIG_MATH_EMULATION | 52 | #ifdef CONFIG_MATH_EMULATION |
52 | #include <asm/math_emu.h> | 53 | #include <asm/math_emu.h> |
53 | #endif | 54 | #endif |
diff --git a/include/asm-i386/irq.h b/include/asm-i386/irq.h index 270f1986b19f..5169d7af456f 100644 --- a/include/asm-i386/irq.h +++ b/include/asm-i386/irq.h | |||
@@ -21,8 +21,6 @@ static __inline__ int irq_canonicalize(int irq) | |||
21 | return ((irq == 2) ? 9 : irq); | 21 | return ((irq == 2) ? 9 : irq); |
22 | } | 22 | } |
23 | 23 | ||
24 | extern void release_vm86_irqs(struct task_struct *); | ||
25 | |||
26 | #ifdef CONFIG_X86_LOCAL_APIC | 24 | #ifdef CONFIG_X86_LOCAL_APIC |
27 | # define ARCH_HAS_NMI_WATCHDOG /* See include/linux/nmi.h */ | 25 | # define ARCH_HAS_NMI_WATCHDOG /* See include/linux/nmi.h */ |
28 | #endif | 26 | #endif |
diff --git a/include/asm-i386/vm86.h b/include/asm-i386/vm86.h index 40ec82c6914d..952fd6957380 100644 --- a/include/asm-i386/vm86.h +++ b/include/asm-i386/vm86.h | |||
@@ -16,7 +16,11 @@ | |||
16 | #define IF_MASK 0x00000200 | 16 | #define IF_MASK 0x00000200 |
17 | #define IOPL_MASK 0x00003000 | 17 | #define IOPL_MASK 0x00003000 |
18 | #define NT_MASK 0x00004000 | 18 | #define NT_MASK 0x00004000 |
19 | #ifdef CONFIG_VM86 | ||
19 | #define VM_MASK 0x00020000 | 20 | #define VM_MASK 0x00020000 |
21 | #else | ||
22 | #define VM_MASK 0 /* ignored */ | ||
23 | #endif | ||
20 | #define AC_MASK 0x00040000 | 24 | #define AC_MASK 0x00040000 |
21 | #define VIF_MASK 0x00080000 /* virtual interrupt flag */ | 25 | #define VIF_MASK 0x00080000 /* virtual interrupt flag */ |
22 | #define VIP_MASK 0x00100000 /* virtual interrupt pending */ | 26 | #define VIP_MASK 0x00100000 /* virtual interrupt pending */ |
@@ -200,9 +204,25 @@ struct kernel_vm86_struct { | |||
200 | */ | 204 | */ |
201 | }; | 205 | }; |
202 | 206 | ||
207 | #ifdef CONFIG_VM86 | ||
208 | |||
203 | void handle_vm86_fault(struct kernel_vm86_regs *, long); | 209 | void handle_vm86_fault(struct kernel_vm86_regs *, long); |
204 | int handle_vm86_trap(struct kernel_vm86_regs *, long, int); | 210 | int handle_vm86_trap(struct kernel_vm86_regs *, long, int); |
205 | 211 | ||
212 | struct task_struct; | ||
213 | void release_vm86_irqs(struct task_struct *); | ||
214 | |||
215 | #else | ||
216 | |||
217 | #define handle_vm86_fault(a, b) | ||
218 | #define release_vm86_irqs(a) | ||
219 | |||
220 | static inline int handle_vm86_trap(struct kernel_vm86_regs *a, long b, int c) { | ||
221 | return 0; | ||
222 | } | ||
223 | |||
224 | #endif /* CONFIG_VM86 */ | ||
225 | |||
206 | #endif /* __KERNEL__ */ | 226 | #endif /* __KERNEL__ */ |
207 | 227 | ||
208 | #endif | 228 | #endif |
diff --git a/init/Kconfig b/init/Kconfig index 9ac522a40130..f8f6929d8f25 100644 --- a/init/Kconfig +++ b/init/Kconfig | |||
@@ -237,6 +237,16 @@ config UID16 | |||
237 | help | 237 | help |
238 | This enables the legacy 16-bit UID syscall wrappers. | 238 | This enables the legacy 16-bit UID syscall wrappers. |
239 | 239 | ||
240 | config VM86 | ||
241 | depends X86 | ||
242 | default y | ||
243 | bool "Enable VM86 support" if EMBEDDED | ||
244 | help | ||
245 | This option is required by programs like DOSEMU to run 16-bit legacy | ||
246 | code on X86 processors. It also may be needed by software like | ||
247 | XFree86 to initialize some video cards via BIOS. Disabling this | ||
248 | option saves about 6k. | ||
249 | |||
240 | config CC_OPTIMIZE_FOR_SIZE | 250 | config CC_OPTIMIZE_FOR_SIZE |
241 | bool "Optimize for size (Look out for broken compilers!)" | 251 | bool "Optimize for size (Look out for broken compilers!)" |
242 | default y | 252 | default y |
diff --git a/kernel/sys_ni.c b/kernel/sys_ni.c index 72cafc922d39..bd3b9bfcfcec 100644 --- a/kernel/sys_ni.c +++ b/kernel/sys_ni.c | |||
@@ -102,6 +102,8 @@ cond_syscall(sys_setresgid16); | |||
102 | cond_syscall(sys_setresuid16); | 102 | cond_syscall(sys_setresuid16); |
103 | cond_syscall(sys_setreuid16); | 103 | cond_syscall(sys_setreuid16); |
104 | cond_syscall(sys_setuid16); | 104 | cond_syscall(sys_setuid16); |
105 | cond_syscall(sys_vm86old); | ||
106 | cond_syscall(sys_vm86); | ||
105 | 107 | ||
106 | /* arch-specific weak syscall entries */ | 108 | /* arch-specific weak syscall entries */ |
107 | cond_syscall(sys_pciconfig_read); | 109 | cond_syscall(sys_pciconfig_read); |