From mboxrd@z Thu Jan 1 00:00:00 1970 X-Msuck: nntp://news.gmane.org/gmane.linux.lib.musl.general/1616 Path: news.gmane.org!not-for-mail From: idunham@lavabit.com Newsgroups: gmane.linux.lib.musl.general Subject: [PATCH] vm86 syscall wrappers Date: Thu, 16 Aug 2012 20:32:28 -0400 (EDT) Message-ID: <5370.132.241.65.36.1345163548.squirrel@lavabit.com> Reply-To: musl@lists.openwall.com NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed;boundary="----=_20120816203228_56220" X-Trace: ger.gmane.org 1345163566 27226 80.91.229.3 (17 Aug 2012 00:32:46 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Fri, 17 Aug 2012 00:32:46 +0000 (UTC) To: musl@lists.openwall.com Original-X-From: musl-return-1617-gllmg-musl=m.gmane.org@lists.openwall.com Fri Aug 17 02:32:44 2012 Return-path: Envelope-to: gllmg-musl@plane.gmane.org Original-Received: from mother.openwall.net ([195.42.179.200]) by plane.gmane.org with smtp (Exim 4.69) (envelope-from ) id 1T2AUU-00067o-9R for gllmg-musl@plane.gmane.org; Fri, 17 Aug 2012 02:32:42 +0200 Original-Received: (qmail 32283 invoked by uid 550); 17 Aug 2012 00:32:41 -0000 Mailing-List: contact musl-help@lists.openwall.com; run by ezmlm Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: Original-Received: (qmail 32271 invoked from network); 17 Aug 2012 00:32:40 -0000 DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=lavabit; d=lavabit.com; b=yXcJ/Ysj0y4Q8+/Ft8AnAbTTUeXVgBE9t/eF/ZPQwyRsOJTXvZoJZvOIPwc6kc0yJbG/iV/TlJj8n7liuy47NA2ulnuMCOD9Nn4I7reaOkg5UQAcBwFOWKApoS3kQoGBBNgKSH6q4IHXD0BbwlBlQPGwAtBuOduEFizMcDTJcEI=; h=Message-ID:Date:Subject:From:To:User-Agent:MIME-Version:Content-Type; User-Agent: SquirrelMail/1.4.13 Xref: news.gmane.org gmane.linux.lib.musl.general:1616 ------=_20120816203228_56220 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 8bit There are two vm86 syscalls that Linux supports: vm86old and vm86plus. (Musl uses SYS_vm86 to refer to vm86plus) This patch adds wrappers for both, using the names that modern glibc uses. Practically speaking, this should help with compiling dosemu, several graphics-card utilities, and a few other system tools. Isaac Dunham ------=_20120816203228_56220 Content-Type: text/plain; name="vm86.diff" Content-Transfer-Encoding: 8bit Content-Disposition: attachment; filename="vm86.diff" diff --git a/arch/i386/bits/vm86.h b/arch/i386/bits/vm86.h new file mode 100644 index 0000000..808fa42 --- /dev/null +++ b/arch/i386/bits/vm86.h @@ -0,0 +1,154 @@ +#ifndef _BITS_VM86_H +#define _BITS_VM86_H + +#define X86_EFLAGS_CF 0x00000001 +#define X86_EFLAGS_PF 0x00000004 +#define X86_EFLAGS_AF 0x00000010 +#define X86_EFLAGS_ZF 0x00000040 +#define X86_EFLAGS_SF 0x00000080 +#define X86_EFLAGS_TF 0x00000100 +#define X86_EFLAGS_IF 0x00000200 +#define X86_EFLAGS_DF 0x00000400 +#define X86_EFLAGS_OF 0x00000800 +#define X86_EFLAGS_IOPL 0x00003000 +#define X86_EFLAGS_NT 0x00004000 +#define X86_EFLAGS_RF 0x00010000 +#define X86_EFLAGS_VM 0x00020000 +#define X86_EFLAGS_AC 0x00040000 +#define X86_EFLAGS_VIF 0x00080000 +#define X86_EFLAGS_VIP 0x00100000 +#define X86_EFLAGS_ID 0x00200000 + +#define X86_CR0_PE 0x00000001 +#define X86_CR0_MP 0x00000002 +#define X86_CR0_EM 0x00000004 +#define X86_CR0_TS 0x00000008 +#define X86_CR0_ET 0x00000010 +#define X86_CR0_NE 0x00000020 +#define X86_CR0_WP 0x00010000 +#define X86_CR0_AM 0x00040000 +#define X86_CR0_NW 0x20000000 +#define X86_CR0_CD 0x40000000 +#define X86_CR0_PG 0x80000000 + +#define X86_CR3_PWT 0x00000008 +#define X86_CR3_PCD 0x00000010 + +#define X86_CR4_VME 0x00000001 +#define X86_CR4_PVI 0x00000002 +#define X86_CR4_TSD 0x00000004 +#define X86_CR4_DE 0x00000008 +#define X86_CR4_PSE 0x00000010 +#define X86_CR4_PAE 0x00000020 +#define X86_CR4_MCE 0x00000040 +#define X86_CR4_PGE 0x00000080 +#define X86_CR4_PCE 0x00000100 +#define X86_CR4_OSFXSR 0x00000200 +#define X86_CR4_OSXMMEXCPT 0x00000400 +#define X86_CR4_VMXE 0x00002000 +#define X86_CR4_OSXSAVE 0x00040000 + +#define X86_CR8_TPR 0x0000000F + +#define CX86_PCR0 0x20 +#define CX86_GCR 0xb8 +#define CX86_CCR0 0xc0 +#define CX86_CCR1 0xc1 +#define CX86_CCR2 0xc2 +#define CX86_CCR3 0xc3 +#define CX86_CCR4 0xe8 +#define CX86_CCR5 0xe9 +#define CX86_CCR6 0xea +#define CX86_CCR7 0xeb +#define CX86_PCR1 0xf0 +#define CX86_DIR0 0xfe +#define CX86_DIR1 0xff +#define CX86_ARR_BASE 0xc4 +#define CX86_RCR_BASE 0xdc + +#define BIOSSEG 0x0f000 + +#define CPU_086 0 +#define CPU_186 1 +#define CPU_286 2 +#define CPU_386 3 +#define CPU_486 4 +#define CPU_586 5 + +#define VM86_TYPE(retval) ((retval) & 0xff) +#define VM86_ARG(retval) ((retval) >> 8) + +#define VM86_SIGNAL 0 +#define VM86_UNKNOWN 1 +#define VM86_INTx 2 +#define VM86_STI 3 +#define VM86_PICRETURN 4 +#define VM86_TRAP 6 + +#define VM86_PLUS_INSTALL_CHECK 0 +#define VM86_ENTER 1 +#define VM86_ENTER_NO_BYPASS 2 +#define VM86_REQUEST_IRQ 3 +#define VM86_FREE_IRQ 4 +#define VM86_GET_IRQ_BITS 5 +#define VM86_GET_AND_RESET_IRQ 6 + +struct vm86_regs { + long ebx; + long ecx; + long edx; + long esi; + long edi; + long ebp; + long eax; + long __null_ds; + long __null_es; + long __null_fs; + long __null_gs; + long orig_eax; + long eip; + unsigned short cs, __csh; + long eflags; + long esp; + unsigned short ss, __ssh; + unsigned short es, __esh; + unsigned short ds, __dsh; + unsigned short fs, __fsh; + unsigned short gs, __gsh; +}; + +struct revectored_struct { + unsigned long __map[8]; +}; + +struct vm86_struct { + struct vm86_regs regs; + unsigned long flags; + unsigned long screen_bitmap; + unsigned long cpu_type; + struct revectored_struct int_revectored; + struct revectored_struct int21_revectored; +}; + +#define VM86_SCREEN_BITMAP 0x0001 + +struct vm86plus_info_struct { + unsigned long force_return_for_pic:1; + unsigned long vm86dbg_active:1; + unsigned long vm86dbg_TFpendig:1; + unsigned long unused:28; + unsigned long is_vm86pus:1; + unsigned char vm86dbg_intxxtab[32]; +}; +struct vm86plus_struct { + struct vm86_regs regs; + unsigned long flags; + unsigned long screen_bitmap; + unsigned long cpu_type; + struct revectored_struct int_revectored; + struct revectored_struct int21_revectored; + struct vm86plus_info_struct vm86plus; +}; + + +#endif diff --git a/include/sys/vm86.h b/include/sys/vm86.h new file mode 100644 index 0000000..a8eb3d7 --- /dev/null +++ b/include/sys/vm86.h @@ -0,0 +1,9 @@ +#ifndef _SYS_VM86_H +#define _SYS_VM86_H + +#include bits/vm86.h + +int vm86old(struct vm86_struct *info); +int vm86(unsigned long fn, struct vm86plus_struct *v86); + +#endif diff --git a/src/linux/vm86.c b/src/linux/vm86.c new file mode 100644 index 0000000..5ade96a --- /dev/null +++ b/src/linux/vm86.c @@ -0,0 +1,26 @@ +/* + * vm86plus/vm86old support. + * vm86old is the original vm86, as provided by libc5, klibc, & glibc <2.3.3 + * vm86(plus) is the new syscall; glibc 2.3.4 + calls this vm86, and renames + * vm86 as originally implemented to vm86old. + * The question is thus which to call vm86. + */ +#include "syscall.h" + +#ifdef SYS_vm86old +struct vm86_struct; + +int vm86old(struct vm86_struct *info) +{ + return syscall(SYS_vm86old, info); +} +#endif + +#ifdef SYS_vm86 +struct vm86plus_struct; + +int vm86(unsigned long fn, struct vm86plus_struct *v86) +{ + return syscall(SYS_vm86, fn, v86); +} +#endif ------=_20120816203228_56220--