diff options
author | mdodd <mdodd@FreeBSD.org> | 2003-06-13 00:36:03 +0000 |
---|---|---|
committer | mdodd <mdodd@FreeBSD.org> | 2003-06-13 00:36:03 +0000 |
commit | 12a43e4609e292a8de9cc82d3be51302f7b129e3 (patch) | |
tree | dad996fa25d3b0f354f02985398fee0f7d56b2d5 /sys | |
parent | 56787fa7b199f3e56307c941bd464b9fcfcde7d5 (diff) | |
download | FreeBSD-src-12a43e4609e292a8de9cc82d3be51302f7b129e3.zip FreeBSD-src-12a43e4609e292a8de9cc82d3be51302f7b129e3.tar.gz |
Despite my best efforts the Linux way of doing this is the only
way that works correctly.
- Remove unused function.
- Move declaration of variables to .S file.
Diffstat (limited to 'sys')
-rw-r--r-- | sys/i386/bios/smapi.c | 13 | ||||
-rw-r--r-- | sys/i386/bios/smapi_bios.S | 45 |
2 files changed, 20 insertions, 38 deletions
diff --git a/sys/i386/bios/smapi.c b/sys/i386/bios/smapi.c index fd6b1fe..5b90896 100644 --- a/sys/i386/bios/smapi.c +++ b/sys/i386/bios/smapi.c @@ -67,9 +67,8 @@ struct smapi_softc { struct smapi_bios_header *header; }; -u_long smapi32_offset; -u_short smapi32_segment; -#define SMAPI32_SEGMENT 0x18 +extern u_long smapi32_offset; +extern u_short smapi32_segment; devclass_t smapi_devclass; @@ -123,14 +122,8 @@ smapi_ioctl (dev, cmd, data, fflag, td) error = 0; break; case SMAPIOCGFUNCTION: -#if 1 - smapi32_segment = SMAPI32_SEGMENT; smapi32_offset = sc->smapi32_entry; - error = smapi32( -#else - error = smapi32_new(sc->smapi32_entry, SMAPI32_SEGMENT, -#endif - (struct smapi_bios_parameter *)data, + error = smapi32((struct smapi_bios_parameter *)data, (struct smapi_bios_parameter *)data); break; default: diff --git a/sys/i386/bios/smapi_bios.S b/sys/i386/bios/smapi_bios.S index 3e24a4e..3a28005 100644 --- a/sys/i386/bios/smapi_bios.S +++ b/sys/i386/bios/smapi_bios.S @@ -3,11 +3,28 @@ __FBSDID("$FreeBSD$"); #include <machine/asmacros.h> +/* + * This is cribbed from the Linux thinkpad-4.1 driver by + * Thomas Hood. + */ + + .align +smapi32_entry: /* far pointer to SMAPI entry */ + .globl smapi32_offset +smapi32_offset: .long 0x00000000 /* set by caller */ +smapi32_segment: .word 0x0000 /* %cs stored here */ + .text /* * smapi32(input_param, output_param) * struct smapi_bios_parameter *input_parm; * struct smapi_bios_parameter *output_parm; + * + * stack frame: + * 0x00 : saved ebp + * 0x04 : return EIP + * 0x08 : input_parm + * 0x0c : output_parm */ ENTRY(smapi32) pushl %ebp /* Save frame */ @@ -24,31 +41,3 @@ ENTRY(smapi32) leave ret - -/* - * smapi32(offset, segment, input_param, output_param) - * u_int offset; - * u_short segment; - * struct smapi_bios_parameter *input_parm; - * struct smapi_bios_parameter *output_parm; - */ -ENTRY(smapi32_new) - pushl %ebp /* Save frame */ - movl %esp,%ebp - - movl 0x08(%ebp),%eax - movl %eax,smapi32_offset - movw 0x0c(%ebp),%ax - movw %ax,smapi32_segment - - pushl %ds - pushl 0x20(%ebp) /* Output Param */ - pushl %ds - pushl 0x10(%ebp) /* Input Param */ - - movl $0,%eax - movw %cs,smapi32_segment - lcall *(smapi32_offset) - - leave - ret |