diff options
| author | Matt Mackall <mpm@selenic.com> | 2006-01-08 01:05:26 -0800 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-01-08 20:14:11 -0800 | 
| commit | 64ca9004b819ab87648dbfc78f3ef49ee491343e (patch) | |
| tree | 9b5daef5280800a0006343a17f63072658d91a1d | |
| parent | 708e9a794cf8822b760edaccd9053edb07c34d19 (diff) | |
[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: Matt Mackall <mpm@selenic.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
| -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 @@  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 \  		pci-dma.o i386_ksyms.o i387.o dmi_scan.o bootflag.o \  		quirks.o i8237.o @@ -34,6 +34,7 @@ obj-$(CONFIG_ACPI_SRAT) 	+= srat.o  obj-$(CONFIG_HPET_TIMER) 	+= time_hpet.o  obj-$(CONFIG_EFI) 		+= efi.o efi_stub.o  obj-$(CONFIG_DOUBLEFAULT) 	+= doublefault.o +obj-$(CONFIG_VM86)		+= vm86.o  obj-$(CONFIG_EARLY_PRINTK)	+= early_printk.o  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  	ALIGN  work_notifysig_v86: +#ifdef CONFIG_VM86  	pushl %ecx			# save ti_flags for do_notify_resume  	call save_v86_state		# %eax contains pt_regs pointer  	popl %ecx @@ -330,6 +331,7 @@ work_notifysig_v86:  	xorl %edx, %edx  	call do_notify_resume  	jmp resume_userspace +#endif  	# perform syscall exit tracing  	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 @@  #include <asm/processor.h>  #include <asm/i387.h>  #include <asm/desc.h> +#include <asm/vm86.h>  #ifdef CONFIG_MATH_EMULATION  #include <asm/math_emu.h>  #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)  	return ((irq == 2) ? 9 : irq);  } -extern void release_vm86_irqs(struct task_struct *); -  #ifdef CONFIG_X86_LOCAL_APIC  # define ARCH_HAS_NMI_WATCHDOG		/* See include/linux/nmi.h */  #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 @@  #define IF_MASK		0x00000200  #define IOPL_MASK	0x00003000  #define NT_MASK		0x00004000 +#ifdef CONFIG_VM86  #define VM_MASK		0x00020000 +#else +#define VM_MASK		0 /* ignored */ +#endif  #define AC_MASK		0x00040000  #define VIF_MASK	0x00080000	/* virtual interrupt flag */  #define VIP_MASK	0x00100000	/* virtual interrupt pending */ @@ -200,9 +204,25 @@ struct kernel_vm86_struct {   */  }; +#ifdef CONFIG_VM86 +  void handle_vm86_fault(struct kernel_vm86_regs *, long);  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 diff --git a/init/Kconfig b/init/Kconfig index 9ac522a40130..f8f6929d8f25 100644 --- a/init/Kconfig +++ b/init/Kconfig @@ -237,6 +237,16 @@ config UID16  	help  	  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  	bool "Optimize for size (Look out for broken compilers!)"  	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);  cond_syscall(sys_setresuid16);  cond_syscall(sys_setreuid16);  cond_syscall(sys_setuid16); +cond_syscall(sys_vm86old); +cond_syscall(sys_vm86);  /* arch-specific weak syscall entries */  cond_syscall(sys_pciconfig_read); | 
