[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>
This commit is contained in:
committed by
Linus Torvalds
parent
708e9a794c
commit
64ca9004b8
@@ -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
|
|||||||
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
|
|||||||
|
|
||||||
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:
|
|||||||
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 @@
|
|||||||
#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)
|
|||||||
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 @@
|
|||||||
#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 {
|
|||||||
*/
|
*/
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#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
|
||||||
|
10
init/Kconfig
10
init/Kconfig
@@ -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);
|
|||||||
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);
|
||||||
|
Reference in New Issue
Block a user