xref: /freebsd/sys/i386/bios/smapi_bios.S (revision 2be1a816b9ff69588e55be0a84cbe2a31efc0f2f)
1#include <machine/asm.h>
2__FBSDID("$FreeBSD$");
3
4/*
5 * This is cribbed from the Linux thinkpad-4.1 driver by
6 * Thomas Hood.
7 */
8
9	.align
10smapi32_entry:					/* far pointer to SMAPI entry */
11	.globl	smapi32_offset
12smapi32_offset:		.long	0x00000000	/* set by caller */
13smapi32_segment:	.word	0x0000		/* %cs stored here */
14
15	.text
16/*
17 * smapi32(input_param, output_param)
18 *	struct smapi_bios_parameter *input_parm;
19 *	struct smapi_bios_parameter *output_parm;
20 *
21 *	stack frame:
22 *		0x00 : saved ebp
23 *		0x04 : return EIP
24 *		0x08 : input_parm
25 *		0x0c : output_parm
26 */
27ENTRY(smapi32)
28	pushl	%ebp			/* Save frame */
29	movl	%esp,%ebp
30
31	pushl	%ds
32	pushl	0x0c(%ebp)		/* Output Param */
33	pushl	%ds
34	pushl	0x08(%ebp)		/* Input Param */
35
36	movl	$0,%eax			/* Clear EAX (return 0) */
37	movw	%cs,smapi32_segment	/* Save CS */
38	lcall	*(smapi32_offset)
39
40	leave
41	ret
42