1/*	$NetBSD: pxe_call.S,v 1.4 2013/10/20 00:16:16 christos Exp $	*/
2
3/*
4 * Copyright 2001 Wasabi Systems, Inc.
5 * All rights reserved.
6 *
7 * Written by Jason R. Thorpe for Wasabi Systems, Inc.
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
11 * are met:
12 * 1. Redistributions of source code must retain the above copyright
13 *    notice, this list of conditions and the following disclaimer.
14 * 2. Redistributions in binary form must reproduce the above copyright
15 *    notice, this list of conditions and the following disclaimer in the
16 *    documentation and/or other materials provided with the distribution.
17 * 3. All advertising materials mentioning features or use of this software
18 *    must display the following acknowledgement:
19 *	This product includes software developed for the NetBSD Project by
20 *	Wasabi Systems, Inc.
21 * 4. The name of Wasabi Systems, Inc. may not be used to endorse
22 *    or promote products derived from this software without specific prior
23 *    written permission.
24 *
25 * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``AS IS'' AND
26 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
27 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
28 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL WASABI SYSTEMS, INC
29 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
30 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
31 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
32 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
33 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
34 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
35 * POSSIBILITY OF SUCH DAMAGE.
36 */
37
38/*
39 * Low level PXE BIOS call glue.
40 */
41
42#include <machine/asm.h>
43
44ENTRY(pxecall_bangpxe)
45	pushl	%ebp
46	movl	%esp, %ebp
47	pushl	%ebx
48	pushl	%ecx
49	pushl	%edx
50
51	/* For simplicity, just move all 32 bits. */
52	movl	8(%ebp), %ebx
53
54	pushw	_C_LABEL(pxe_command_buf_seg)
55	pushw	_C_LABEL(pxe_command_buf_off)
56	pushw	%bx
57
58	call	_C_LABEL(prot_to_real)		# enter real mode
59	.code16
60
61	/* The encoding is: 0x9a offlo offhi seglo seghi */
62	lcall	$0, $0xffff
63	.globl	_C_LABEL(bangpxe_off)
64_C_LABEL(bangpxe_off) = . - 4
65	.globl	_C_LABEL(bangpxe_seg)
66_C_LABEL(bangpxe_seg) = . - 2
67
68	calll	_C_LABEL(real_to_prot)		# leave real mode
69	.code32
70
71	add	$6, %esp
72
73	popl	%edx
74	popl	%ecx
75	popl	%ebx
76	popl	%ebp
77	ret
78
79ENTRY(pxecall_pxenv)
80	pushl	%ebp
81	movl	%esp, %ebp
82	pushl	%ebx
83	pushl	%ecx
84	pushl	%edx
85	pushl	%edi
86
87	/* For simplicity, just move all 32 bits. */
88	movl	8(%ebp), %ebx
89
90	call	_C_LABEL(prot_to_real)		# enter real mode
91	.code16
92
93	/* prot_to_real() has already set %es to BOOTSEG */
94	lea	_C_LABEL(pxe_command_buf), %di
95
96	/* The encoding is: 0x9a offlo offhi seglo seghi */
97	lcall	$0, $0xffff
98	.globl	_C_LABEL(pxenv_off)
99_C_LABEL(pxenv_off) = . - 4
100	.globl	_C_LABEL(pxenv_seg)
101_C_LABEL(pxenv_seg) = . - 2
102
103	calll	_C_LABEL(real_to_prot)		# leave real mode
104	.code32
105
106	popl	%edi
107	popl	%edx
108	popl	%ecx
109	popl	%ebx
110	popl	%ebp
111	ret
112
113	.globl _C_LABEL(pxe_command_buf)
114	.align 32
115	.type	_C_LABEL(pxe_command_buf), @object
116	.size	_C_LABEL(pxe_command_buf), 256
117_C_LABEL(pxe_command_buf):
118	.zero	256
119