Commit 64ca9004 authored by Matt Mackall's avatar Matt Mackall Committed by Linus Torvalds

[PATCH] Make vm86 support optional

This adds an option to remove vm86 support under CONFIG_EMBEDDED.  Saves
about 5k.

This version eliminates most of the #ifdefs of the previous version and
instead uses function stubs in vm86.h.  Also, release_vm86_irqs is moved
from asm-i386/irq.h to a more appropriate home in vm86.h so that the stubs
can live together.

$ size vmlinux-baseline vmlinux-novm86
   text    data     bss     dec     hex filename
2920821  523232  190652 3634705  377611 vmlinux-baseline
2916268  523100  190492 3629860  376324 vmlinux-novm86
Signed-off-by: default avatarMatt Mackall <mpm@selenic.com>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 708e9a79
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
extra-y := head.o init_task.o vmlinux.lds extra-y := head.o init_task.o vmlinux.lds
obj-y := process.o semaphore.o signal.o entry.o traps.o irq.o vm86.o \ obj-y := process.o semaphore.o signal.o entry.o traps.o irq.o \
ptrace.o time.o ioport.o ldt.o setup.o i8259.o sys_i386.o \ ptrace.o time.o ioport.o ldt.o setup.o i8259.o sys_i386.o \
pci-dma.o i386_ksyms.o i387.o dmi_scan.o bootflag.o \ pci-dma.o i386_ksyms.o i387.o dmi_scan.o bootflag.o \
quirks.o i8237.o quirks.o i8237.o
...@@ -34,6 +34,7 @@ obj-$(CONFIG_ACPI_SRAT) += srat.o ...@@ -34,6 +34,7 @@ obj-$(CONFIG_ACPI_SRAT) += srat.o
obj-$(CONFIG_HPET_TIMER) += time_hpet.o obj-$(CONFIG_HPET_TIMER) += time_hpet.o
obj-$(CONFIG_EFI) += efi.o efi_stub.o obj-$(CONFIG_EFI) += efi.o efi_stub.o
obj-$(CONFIG_DOUBLEFAULT) += doublefault.o obj-$(CONFIG_DOUBLEFAULT) += doublefault.o
obj-$(CONFIG_VM86) += vm86.o
obj-$(CONFIG_EARLY_PRINTK) += early_printk.o obj-$(CONFIG_EARLY_PRINTK) += early_printk.o
EXTRA_AFLAGS := -traditional EXTRA_AFLAGS := -traditional
......
...@@ -323,6 +323,7 @@ work_notifysig: # deal with pending signals and ...@@ -323,6 +323,7 @@ work_notifysig: # deal with pending signals and
ALIGN ALIGN
work_notifysig_v86: work_notifysig_v86:
#ifdef CONFIG_VM86
pushl %ecx # save ti_flags for do_notify_resume pushl %ecx # save ti_flags for do_notify_resume
call save_v86_state # %eax contains pt_regs pointer call save_v86_state # %eax contains pt_regs pointer
popl %ecx popl %ecx
...@@ -330,6 +331,7 @@ work_notifysig_v86: ...@@ -330,6 +331,7 @@ work_notifysig_v86:
xorl %edx, %edx xorl %edx, %edx
call do_notify_resume call do_notify_resume
jmp resume_userspace jmp resume_userspace
#endif
# perform syscall exit tracing # perform syscall exit tracing
ALIGN ALIGN
......
...@@ -48,6 +48,7 @@ ...@@ -48,6 +48,7 @@
#include <asm/processor.h> #include <asm/processor.h>
#include <asm/i387.h> #include <asm/i387.h>
#include <asm/desc.h> #include <asm/desc.h>
#include <asm/vm86.h>
#ifdef CONFIG_MATH_EMULATION #ifdef CONFIG_MATH_EMULATION
#include <asm/math_emu.h> #include <asm/math_emu.h>
#endif #endif
......
...@@ -21,8 +21,6 @@ static __inline__ int irq_canonicalize(int irq) ...@@ -21,8 +21,6 @@ static __inline__ int irq_canonicalize(int irq)
return ((irq == 2) ? 9 : irq); return ((irq == 2) ? 9 : irq);
} }
extern void release_vm86_irqs(struct task_struct *);
#ifdef CONFIG_X86_LOCAL_APIC #ifdef CONFIG_X86_LOCAL_APIC
# define ARCH_HAS_NMI_WATCHDOG /* See include/linux/nmi.h */ # define ARCH_HAS_NMI_WATCHDOG /* See include/linux/nmi.h */
#endif #endif
......
...@@ -16,7 +16,11 @@ ...@@ -16,7 +16,11 @@
#define IF_MASK 0x00000200 #define IF_MASK 0x00000200
#define IOPL_MASK 0x00003000 #define IOPL_MASK 0x00003000
#define NT_MASK 0x00004000 #define NT_MASK 0x00004000
#ifdef CONFIG_VM86
#define VM_MASK 0x00020000 #define VM_MASK 0x00020000
#else
#define VM_MASK 0 /* ignored */
#endif
#define AC_MASK 0x00040000 #define AC_MASK 0x00040000
#define VIF_MASK 0x00080000 /* virtual interrupt flag */ #define VIF_MASK 0x00080000 /* virtual interrupt flag */
#define VIP_MASK 0x00100000 /* virtual interrupt pending */ #define VIP_MASK 0x00100000 /* virtual interrupt pending */
...@@ -200,9 +204,25 @@ struct kernel_vm86_struct { ...@@ -200,9 +204,25 @@ struct kernel_vm86_struct {
*/ */
}; };
#ifdef CONFIG_VM86
void handle_vm86_fault(struct kernel_vm86_regs *, long); void handle_vm86_fault(struct kernel_vm86_regs *, long);
int handle_vm86_trap(struct kernel_vm86_regs *, long, int); int handle_vm86_trap(struct kernel_vm86_regs *, long, int);
struct task_struct;
void release_vm86_irqs(struct task_struct *);
#else
#define handle_vm86_fault(a, b)
#define release_vm86_irqs(a)
static inline int handle_vm86_trap(struct kernel_vm86_regs *a, long b, int c) {
return 0;
}
#endif /* CONFIG_VM86 */
#endif /* __KERNEL__ */ #endif /* __KERNEL__ */
#endif #endif
...@@ -237,6 +237,16 @@ config UID16 ...@@ -237,6 +237,16 @@ config UID16
help help
This enables the legacy 16-bit UID syscall wrappers. This enables the legacy 16-bit UID syscall wrappers.
config VM86
depends X86
default y
bool "Enable VM86 support" if EMBEDDED
help
This option is required by programs like DOSEMU to run 16-bit legacy
code on X86 processors. It also may be needed by software like
XFree86 to initialize some video cards via BIOS. Disabling this
option saves about 6k.
config CC_OPTIMIZE_FOR_SIZE config CC_OPTIMIZE_FOR_SIZE
bool "Optimize for size (Look out for broken compilers!)" bool "Optimize for size (Look out for broken compilers!)"
default y default y
......
...@@ -102,6 +102,8 @@ cond_syscall(sys_setresgid16); ...@@ -102,6 +102,8 @@ cond_syscall(sys_setresgid16);
cond_syscall(sys_setresuid16); cond_syscall(sys_setresuid16);
cond_syscall(sys_setreuid16); cond_syscall(sys_setreuid16);
cond_syscall(sys_setuid16); cond_syscall(sys_setuid16);
cond_syscall(sys_vm86old);
cond_syscall(sys_vm86);
/* arch-specific weak syscall entries */ /* arch-specific weak syscall entries */
cond_syscall(sys_pciconfig_read); cond_syscall(sys_pciconfig_read);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment