-/* $OpenBSD: bioscom.S,v 1.3 1997/03/31 23:06:26 mickey Exp $ */
+/* $OpenBSD: bioscom.S,v 1.4 1997/04/09 08:39:12 mickey Exp $ */
/*
* Mach Operating System
* the rights to redistribute these changes.
*
* from: Mach, Revision 2.2 92/04/04 11:34:26 rpd
- * $Id: bioscom.S,v 1.3 1997/03/31 23:06:26 mickey Exp $
+ * $Id: bioscom.S,v 1.4 1997/04/09 08:39:12 mickey Exp $
*/
/*
.file "serial.s"
#include <machine/asm.h>
+#define _LOCORE
+#include "biosdev.h"
+#undef _LOCORE
.data
port:
-/* $OpenBSD: biosdev.c,v 1.4 1997/04/08 22:48:27 mickey Exp $ */
+/* $OpenBSD: biosdev.c,v 1.5 1997/04/09 08:39:15 mickey Exp $ */
/*
* Copyright (c) 1996 Michael Shalayeff
}
/* BIOS disk errors translation table */
-static const struct bd_error {
+const struct bd_error {
u_int8_t bd_id;
int unix_id;
char *msg;
-/* $OpenBSD: biosdev.h,v 1.3 1997/03/31 23:06:27 mickey Exp $ */
+/* $OpenBSD: biosdev.h,v 1.4 1997/04/09 08:39:17 mickey Exp $ */
/*
* Copyright (c) 1996 Michael Shalayeff
#define BIOSNHEADS(d) (((d)>>8)+1)
#define BIOSNSECTS(d) ((d)&0xff) /* sectors are 1-based */
+#ifdef _LOCORE
+#define BIOSINT(n) int $0x20+(n)
+#else
+#define BIOSINT(n) __asm ((int $0x20+(n)))
+
/* biosdev.c */
extern const char *biosdevs[];
int biosstrategy __P((void *, int, daddr_t, size_t, void *, size_t *));
int biosioctl __P((struct open_file *, u_long, void *));
/* biosdisk.S */
-u_int biosdinfo __P((int dev));
+u_int16_t biosdinfo __P((int dev));
int biosread __P((int dev, int cyl, int hd, int sect, int nsect, void *));
int bioswrite __P((int dev, int cyl, int hd, int sect, int nsect, void *));
int com_ischar __P((void));
/* biosmem.S */
-u_int biosmem __P((int));
+u_int biosmem __P((void));
/* biostime.S */
void usleep __P((u_long));
+#endif
-/* $OpenBSD: biosdisk.S,v 1.4 1997/04/05 23:49:07 mickey Exp $ */
+/* $OpenBSD: biosdisk.S,v 1.5 1997/04/09 08:39:20 mickey Exp $ */
/*
* Ported to boot 386BSD by Julian Elischer (julian@tfs.com) Sept 1992
*/
#include <machine/asm.h>
-#define addr32 .byte 0x67
-#define data32 .byte 0x66
+#define _LOCORE
+#include "debug_md.h"
+#include "biosdev.h"
+#undef _LOCORE
/*
# BIOS call "INT 0x13 Function 0x2" to read sectors from disk into memory
ENTRY(biosread)
pushl %ebp
movl %esp, %ebp
- pushal
+ pushl %ecx
+ pushl %ebx
+ pushl %edi
+ pushl %es
movb 8(%ebp), %dl # device
movw 12(%ebp), %cx
incb %cl # sector; sec starts from 1, not 0
movb $0x2, %ah # subfunction
movb 24(%ebp), %al # number of sectors
- movl %eax, %esi # save this against mode switch
movl 28(%ebp), %ebx # offset
movl %ebx, %edi # spilt off for seg:off pair
- shrl $4, %edi
andl $0xf, %ebx # atomic read for up to 64k
+ shrl $4, %edi
- call _C_LABEL(prot_to_real) # enter real mode
-
- movl %di, %es
- movl %si, %ax
- int $0x13
- movb $0, %cl
+ BIOSINT(0x13)
+ movb $0, %al
jnc 1f
- movb %ah, %cl
+ movb %ah, %al
1:
- data32
- call _C_LABEL(real_to_prot) # back to protected mode
-
- movzbl %cl, %eax # return value in %ax
- movl %eax, 1f
+ movzbl %al, %eax # return value in %ax
- popal
- movl 1f, %eax
+ popl %es
+ popl %edi
+ popl %ebx
+ popl %ecx
popl %ebp
ret
-1: .long 0
ENTRY(bioswrite)
movl %esp, %ebp
pushl %ebx
pushl %ecx
- pushl %edx
movb 8(%ebp), %dl # diskinfo(drive #)
-
- call _C_LABEL(prot_to_real) # enter real mode
-
movb $0x08, %ah # ask for disk info
- int $0x13
- jnc ok
-
- /*
- * Urk. Call failed. It is not supported for floppies by old BIOS's.
- * Guess it's a 15-sector floppy. Initialize all the registers for
- * documentation, although we only need head and sector counts.
- */
- xorl %bx, %bx # %bh = 0
- incl %bx; incl %bx # %bl bits 0-3 = drive type, 2 = 1.2M
- movb $79, %ch # max track
- movb $15, %cl # max sector
- xorl %dx, %dx
- incl %dx # floppy drives installed
- movb %dl, %dh # max head
- # es:di = parameter table
- # carry = 0
-
-ok:
- data32
- call _C_LABEL(real_to_prot) # back to protected mode
-
- xorl %eax, %eax
+ BIOSINT(0x13)
+ movb $1, %ah # max head
+ movb $18, %al # max sector
+ jc 1f
/* form a longword representing all this gunk */
movb %dh, %ah # max head
andb $0x3f, %cl # mask of cylinder gunk
movb %cl, %al # max sector (and # sectors)
-
- popl %edx
+1:
popl %ecx
popl %ebx
popl %ebp
-/* $OpenBSD: bioskbd.S,v 1.3 1997/03/31 23:06:28 mickey Exp $ */
+/* $OpenBSD: bioskbd.S,v 1.4 1997/04/09 08:39:23 mickey Exp $ */
/*
* Ported to boot 386BSD by Julian Elischer (julian@tfs.com) Sept 1992
*/
#include <machine/asm.h>
-#define addr32 .byte 0x67
-#define data32 .byte 0x66
+#define _LOCORE
+#include "biosdev.h"
+#undef _LOCORE
/*
* int kbd_probe();
# %bl = foreground color
*/
ENTRY(kbd_putc)
- pushl %ebp
- movl %esp, %ebp
- pushal
-
- movb 8(%ebp), %cl
-
- call _C_LABEL(prot_to_real)
-
- movb %cl, %al
+ pushl %ebx
+ movb 8(%esp), %al
movb $0x0e, %ah
- xorl %bx, %bx
- incl %bx
- int $0x10 # display a byte
-
- data32
- call _C_LABEL(real_to_prot)
+ xorl %ebx, %ebx
+ incl %ebx
+ BIOSINT(0x10) # display a byte
- popal
- popl %ebp
+ popl %ebx
ret
# %al = ASCII character
*/
ENTRY(kbd_getc)
- pushl %ebp
- movl %esp, %ebp
- pushl %ebx
- pushl %esi
- pushl %edi
-
- call _C_LABEL(prot_to_real)
-
xorl %eax, %eax
- int $0x16
-
- movb %al, %bl # real_to_prot uses %eax
-
- data32
- call _C_LABEL(real_to_prot)
-
- movzbl %bl, %eax
-
- popl %edi
- popl %esi
- popl %ebx
- popl %ebp
+ BIOSINT(0x16)
+ movzbl %al, %eax
ret
# ZF = set
*/
ENTRY(kbd_ischar)
- pushal
-
- call _C_LABEL(prot_to_real)
-
movb $0x01, %ah
- int $0x16
- setnz %ah
-
- movb %ah, %bl # real_to_prot uses %eax
-
- data32
- call _C_LABEL(real_to_prot)
-
- movzbl %bl, %eax
- movl %eax, 1f
-
- popal
- movl 1f, %eax
+ BIOSINT(0x16)
+ setnz %al
+ movzbl %al, %eax
ret
-1: .long 0
-/* $OpenBSD: biosmem.S,v 1.1 1997/03/31 23:08:36 mickey Exp $ */
-
-/*
- * Ported to boot 386BSD by Julian Elischer (julian@tfs.com) Sept 1992
- *
- * Mach Operating System
- * Copyright (c) 1992, 1991 Carnegie Mellon University
- * All Rights Reserved.
- *
- * Permission to use, copy, modify and distribute this software and its
- * documentation is hereby granted, provided that both the copyright
- * notice and this permission notice appear in all copies of the
- * software, derivative works or modified versions, and any portions
- * thereof, and that both notices appear in supporting documentation.
- *
- * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
- * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
- * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
- *
- * Carnegie Mellon requests users of this software to return to
- *
- * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU
- * School of Computer Science
- * Carnegie Mellon University
- * Pittsburgh PA 15213-3890
- *
- * any improvements or extensions that they make and grant Carnegie Mellon
- * the rights to redistribute these changes.
- */
-
-/*
- Copyright 1988, 1989, 1990, 1991, 1992
- by Intel Corporation, Santa Clara, California.
-
- All Rights Reserved
-
-Permission to use, copy, modify, and distribute this software and
-its documentation for any purpose and without fee is hereby
-granted, provided that the above copyright notice appears in all
-copies and that both the copyright notice and this permission notice
-appear in supporting documentation, and that the name of Intel
-not be used in advertising or publicity pertaining to distribution
-of the software without specific, written prior permission.
-
-INTEL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE
-INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS,
-IN NO EVENT SHALL INTEL BE LIABLE FOR ANY SPECIAL, INDIRECT, OR
-CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
-LOSS OF USE, DATA OR PROFITS, WHETHER IN ACTION OF CONTRACT,
-NEGLIGENCE, OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
-WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-*/
+/* $OpenBSD: biosmem.S,v 1.2 1997/04/09 08:39:24 mickey Exp $ */
#include <machine/asm.h>
-#define data32 .byte 0x66
-
-/*
-#
-# biosmem(i) : return the memory size in KB. i == 0 for conventional memory,
-# i == 1 for extended memory
-# BIOS call "INT 12H" to get conventional memory size
-# BIOS call "INT 15H, AH=88H" to get extended memory size
-# Both have the return value in AX.
-#
-*/
+#define _LOCORE
+#include "biosdev.h"
+#undef _LOCORE
ENTRY(biosmem)
- pushl %ebp
- movl %esp, %ebp
- pushl %esi
- pushl %edi
-
- movl 8(%ebp), %edx
-
- call _C_LABEL(prot_to_real) # enter real mode
-
- testb %dl, %dl
- jnz 1f
-
- int $0x12
- jmp 2f
-
-1:
- movb $0x88, %ah
- int $0x15
-
-2:
- movl %eax, %edx
-
- data32
- call _C_LABEL(real_to_prot)
-
- movl %edx, %eax
- popl %edi
- popl %esi
- popl %ebp
+ BIOSINT(0x12)
ret
-/* $OpenBSD: biostime.S,v 1.2 1997/03/31 03:12:12 weingart Exp $ */
+/* $OpenBSD: biostime.S,v 1.3 1997/04/09 08:39:27 mickey Exp $ */
/*
* Ported to boot 386BSD by Julian Elischer (julian@tfs.com) Sept 1992
*/
#include <machine/asm.h>
-#define addr32 .byte 0x67
-#define data32 .byte 0x66
+#define _LOCORE
+#include "biosdev.h"
+#undef _LOCORE
/*
# BIOS call "INT 15H Function 86H" to sleep for a set number of microseconds
# CF = clear
*/
ENTRY(usleep)
- pushl %ebp
- movl %esp, %ebp
- pushl %ebx
+ pushl %ecx
+ pushl %edx
- movw 8(%ebp), %dx
- movw 10(%ebp), %cx
-
- call _C_LABEL(prot_to_real)
+ movw 12(%esp), %dx
+ movw 14(%esp), %cx
movb $0x86, %ah
- int $0x15
- setnc %ah
-
- movb %ah, %bl # real_to_prot uses %eax
-
- data32
- call _C_LABEL(real_to_prot)
-
- movzbl %bl, %eax
+ BIOSINT(0x15)
+ setnc %al
+ movzbl %al, %eax
- popl %ebx
- popl %ebp
+ popl %edx
+ popl %ecx
ret
/*
-/* $OpenBSD: debug.c,v 1.2 1997/04/05 18:56:24 mickey Exp $ */
+/* $OpenBSD: debug.c,v 1.3 1997/04/09 08:39:29 mickey Exp $ */
/*
* Copyright (c) 1997 Michael Shalayeff
const int nreg = NENTS(reg_names);
struct reg reg;
const u_int32_t *reg_values[] = { REG_VALUES(reg) };
+const char *trap_names[] = { TRAP_NAMES };
int
debug_init()
{
int i;
- printf("trap: %u\n", trapno);
+ printf("trap: %s\n", trap_names[trapno]);
for (i = 0; i < nreg; putchar((++i % 4)?' ':'\n'))
printf ("%s=0x%x", reg_names[i], *reg_values[i]);
if (i % 4)
-/* $OpenBSD: debug_i386.S,v 1.3 1997/04/05 18:56:25 mickey Exp $ */
+/* $OpenBSD: debug_i386.S,v 1.4 1997/04/09 08:39:32 mickey Exp $ */
/*
* Copyright (c) 1997 Michael Shalayeff
pushl %es
#ifdef DEBUG
movl $0xb8280, %edi
- movl $0x47314730, (%edi)
+ movl 0x0a*4(%esp), %eax # trapno
+ addb $'0', %al
+ movb $0x47, %ah
+ movl %eax, (%edi)
#endif
call _check_regs
1:
movl %ax, %ds
movl $_reg, %edi
cld
- movl 0x0a(%esp,4), %eax; stosl # %eax
- movl 0x09(%esp,4), %eax; stosl # %ecx
- movl 0x08(%esp,4), %eax; stosl # %edx
- movl 0x07(%esp,4), %eax; stosl # %ebx
- movl 0x06(%esp,4), %eax; stosl # %esp
- movl 0x05(%esp,4), %eax; stosl # %ebp
- movl 0x04(%esp,4), %eax; stosl # %esi
- movl 0x03(%esp,4), %eax; stosl # %edi
- movl 0x0d(%esp,4), %eax; stosl # %eip
- movl 0x0f(%esp,4), %eax; stosl # %eflags
- movl 0x0e(%esp,4), %eax; stosl # %cs
+ movl 0x0a*4(%esp), %eax; stosl # %eax
+ movl 0x09*4(%esp), %eax; stosl # %ecx
+ movl 0x08*4(%esp), %eax; stosl # %edx
+ movl 0x07*4(%esp), %eax; stosl # %ebx
+ movl 0x06*4(%esp), %eax; stosl # %esp
+ movl 0x05*4(%esp), %eax; stosl # %ebp
+ movl 0x04*4(%esp), %eax; stosl # %esi
+ movl 0x03*4(%esp), %eax; stosl # %edi
+ movl 0x0d*4(%esp), %eax; stosl # %eip
+ movl 0x0f*4(%esp), %eax; stosl # %eflags
+ movl 0x0e*4(%esp), %eax; stosl # %cs
movl %ss, %eax; stosl # %ss
- movl 0x02(%esp,4), %eax; stosl # %ds
- movl 0x01(%esp,4), %eax; stosl # %es
+ movl 0x02*4(%esp), %eax; stosl # %ds
+ movl 0x01*4(%esp), %eax; stosl # %es
movl %fs, %eax; stosl # %fs
movl %gs, %eax; stosl # %gs
movl $0xb8288, %edi
movl $0x47354734, (%edi)
#endif
- movl 0x0b(%esp,4), %eax # trapno
+ movl 0x0b*4(%esp), %eax # trapno
pushl %eax
call _C_LABEL(dump_regs)
popl %eax
-/* $OpenBSD: debug_md.h,v 1.2 1997/04/04 04:47:47 mickey Exp $ */
+/* $OpenBSD: debug_md.h,v 1.3 1997/04/09 08:39:34 mickey Exp $ */
/*
* Copyright (c) 1997 Michael Shalayeff
&(r).r_ebp, &(r).r_esi, &(r).r_edi, &(r).r_eip, &(r).r_eflags, \
&(r).r_cs , &(r).r_ss, &(r).r_ds, &(r).r_es, &(r).r_fs, \
&(r).r_gs
+#define TRAP_NAMES \
+ "privileged instruction", "breakpoint trap", "arithmetic trap", \
+ "asynchronous system trap", "protection fault", "trace trap", \
+ "page fault", "alignment fault", "integer divide fault", \
+ "non-maskable interrupt", "overflow trap", "bounds check fault", \
+ "device not available fault", "double fault", \
+ "fp coprocessor operand fetch fault (![P]Pro)", "invalid tss fault", \
+ "segment not present fault", "stack fault", "machine check ([P]Pro)", \
+ "reserved fault base"
#ifdef _LOCORE
.globl _reg
-/* $OpenBSD: exec_i386.c,v 1.4 1997/04/04 17:23:29 weingart Exp $ */
+/* $OpenBSD: exec_i386.c,v 1.5 1997/04/09 08:39:36 mickey Exp $ */
#include <sys/param.h>
#include <sys/exec.h>
argv[4] = (int)esym;
argv[5] = (int)startaddr;
argv[6] = 0;
- argv[7] = biosmem(0);
- argv[8] = biosmem(1);
+ argv[7] = cnvmem;
+ argv[8] = extmem;
#ifdef DEBUG
{ int i;
-/* $OpenBSD: gidt.S,v 1.2 1997/04/07 01:21:54 weingart Exp $ */
+/* $OpenBSD: gidt.S,v 1.3 1997/04/09 08:39:37 mickey Exp $ */
/*
* Copyright (c) 1997 Michael Shalayeff
#include <machine/psl.h>
#define _LOCORE
#include <machine/segments.h>
+#include <machine/specialreg.h>
#include <machine/trap.h>
#include <debug_md.h>
#undef _LOCORE
+#define addr32 .byte 0x67
+#define data32 .byte 0x66
.data
.globl _Gdtr
.word 0xFFFF # lolimit
.word 0 # lobase
.byte 0 # midbase
- .byte SDT_MEMERA | 0 | 0x80 # RWXA, dpl = 0, present
+ .byte SDT_MEMERAC | 0 | 0x80 # RXAC, dpl = 0, present
.byte 0xf | 0 | 0x40 | 0x80 # hilimit, xx, 32bit, 4k granularity
.byte 0 # hibase
/* 0x10 : flat data */
.word 0xFFFF # lolimit
.word 0 # lobase
.byte 0 # midbase
- .byte SDT_MEMERA | 0 | 0x80 # RWXA, dpl = 0, present
- .byte 0xf | 0 | 0 | 0 # hilimit, xx, 16bit, byte granularity
+ .byte SDT_MEMERA | 0 | 0x80 # RXAC, dpl = 0, present
+ .byte 0x0 | 0 | 0 | 0 # hilimit, xx, 16bit, byte granularity
.byte 0 # hibase
_Gdtr: .word . - gdt - 1
.long gdt
IDTENTRY(xx); IDTENTRY(xx); IDTENTRY(xx); IDTENTRY(xx)
IDTENTRY(xx)
/* Maskable interrupts(32-255) */
+ /* BIOS entry points (32-63) */
+#define IBIOS(n) IPROC(bios/**/n)
+#define IDTBIOS(n) IDTENTRY(bios/**/n)
+ IDTBIOS(0); IDTBIOS(1); IDTBIOS(2); IDTBIOS(3); IDTBIOS(4)
+ IDTBIOS(5); IDTBIOS(6); IDTBIOS(7); IDTBIOS(8); IDTBIOS(9)
+ IDTBIOS(10); IDTBIOS(11); IDTBIOS(12); IDTBIOS(13); IDTBIOS(14)
+ IDTBIOS(15); IDTBIOS(16); IDTBIOS(17); IDTBIOS(18); IDTBIOS(19)
+ IDTBIOS(20); IDTBIOS(21); IDTBIOS(22); IDTBIOS(23)
+ /* DOS entry points */
_Idtr_prot:
- .word . - idt
+ .word . - idt - 1
.long idt
.text
- .globl alltraps
#define IENTRY(name,type) \
IPROC(name): \
pushl $type ; \
- jmp alltraps
+ jmp 1f
#define IENTRY_ERR(name,err,type) \
IPROC(name): \
pushl $err ; \
pushl $type ; \
- jmp alltraps
+ jmp 1f
IPROC(xx):
pushl $1
pushl $256
- jmp alltraps
+ jmp 1f
IENTRY_ERR(de,0,T_DIVIDE)
IENTRY_ERR(db,0,T_TRCTRAP)
IENTRY(ac,T_ALIGNFLT)
IENTRY(mc,T_MACHK)
+ .globl alltraps
+1: /* save on jumps */
+ jmp alltraps
+
+#define IBIOSENT(n) IBIOS(n): pushl %eax; movb $n, %al ; jmp 1f
+
+IBIOSENT(0); IBIOSENT(1); IBIOSENT(2); IBIOSENT(3)
+IBIOSENT(4); IBIOSENT(5); IBIOSENT(6); IBIOSENT(7)
+IBIOSENT(8); IBIOSENT(9); IBIOSENT(10); IBIOSENT(11)
+IBIOSENT(12); IBIOSENT(13); IBIOSENT(14); IBIOSENT(15)
+IBIOSENT(16); IBIOSENT(17); IBIOSENT(18); IBIOSENT(19)
+IBIOSENT(20); IBIOSENT(21); IBIOSENT(22); IBIOSENT(23)
+
+ .text
+ .globl _real_to_prot, _prot_to_real
+1:
+ movb %al, intno
+ popl %eax
+ pushal
+ pushl %ds
+ pushl %es
+
+ call _prot_to_real
+
+ movl %di, %es
+
+ int $0
+intno = . - 1
+
+ movb %ah, %bh
+ lahf
+ xchgb %ah, %bh
+
+ data32
+ call _real_to_prot
+
+ /* pass BIOS return values back to caller */
+ movl %eax, 0x9*4(%esp)
+ movl %ecx, 0x8*4(%esp)
+ movl %edx, 0x7*4(%esp)
+ movb %bh , 0xc*4(%esp)
+
+ popl %es
+ popl %ds
+ popal
+ iret
+
-/* $OpenBSD: memprobe.c,v 1.2 1997/03/31 23:06:30 mickey Exp $ */
+/* $OpenBSD: memprobe.c,v 1.3 1997/04/09 08:39:39 mickey Exp $ */
#include <sys/param.h>
#include "libsa.h"
{
int ram;
- cnvmem = biosmem(0);
- extmem = biosmem(1);
+ cnvmem = biosmem();
/* probe extended memory
*
-/* $OpenBSD: real_prot.S,v 1.4 1997/04/05 18:56:28 mickey Exp $ */
+/* $OpenBSD: real_prot.S,v 1.5 1997/04/09 08:39:42 mickey Exp $ */
/*
* Mach Operating System
ENTRY(real_to_prot)
/* guarantee that interrupts are disabled when in prot mode */
cli
+ addr32
+ data32
+ movl %eax, 2f
/* load the gdtr */
addr32
movl %ax, %ds
movl %ax, %ss
movl %ax, %es
- movl %ax, %fs
- movl %ax, %gs
- /* load idtr so we can debug */
+ /* load idtr for debugger and BIOS iface */
lidt _Idtr_prot
+ # movl Leax, %eax
+ .byte 0xb8
+2: .long 0 /* eax */
ret
/*
ENTRY(prot_to_real)
+ movl %eax, 4f
movl _codeseg, %eax
- # movw %ax, 2f
+ movw %ax, 2f
/* Change to use16 mode. */
ljmp $0x18, $1f
movl %ax, %ds
movl %ax, %ss
movl %ax, %es
- movl %ax, %fs
- movl %ax, %gs
- /* load idtr so we can debug */
+
+ /* load idtr for BIOS operations */
addr32
data32
lidt _Idtr_real
+ addr32
+ data32
+ # movl Leax, %eax
+ .byte 0xb8
+4: .long 0 /* %eax */
+
sti
data32
ret