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); |
