1FILE_LICENCE ( GPL2_OR_LATER )
2
3#define PXENV_UNDI_ISR 0x0014
4#define PXENV_UNDI_ISR_IN_START 1
5#define PXENV_UNDI_ISR_OUT_OURS 0
6#define PXENV_UNDI_ISR_OUT_NOT_OURS 1
7
8#define IRQ_PIC_CUTOFF 8
9#define ICR_EOI_NON_SPECIFIC 0x20
10#define PIC1_ICR 0x20
11#define PIC2_ICR 0xa0
12
13	.text
14	.arch i386
15	.code16
16
17	.section ".text16", "ax", @progbits
18	.globl undiisr
19undiisr:
20
21	/* Preserve registers */
22	pushw	%ds
23	pushw	%es
24	pushw	%fs
25	pushw	%gs
26	pushfl
27	pushal
28
29	/* Set up our segment registers */
30	movw	%cs:rm_ds, %ax
31	movw	%ax, %ds
32
33	/* Check that we have an UNDI entry point */
34	cmpw	$0, pxeparent_entry_point
35	je	chain
36
37	/* Issue UNDI API call */
38	movw	%ax, %es
39	movw	$undinet_params, %di
40	movw	$PXENV_UNDI_ISR, %bx
41	movw	$PXENV_UNDI_ISR_IN_START, funcflag
42	pushw	%es
43	pushw	%di
44	pushw	%bx
45	lcall	*pxeparent_entry_point
46	cli	/* Just in case */
47	addw	$6, %sp
48	cmpw	$PXENV_UNDI_ISR_OUT_OURS, funcflag
49	jne	eoi
50
51trig:	/* Record interrupt occurence */
52	incb	undiisr_trigger_count
53
54eoi:	/* Send EOI */
55	movb	$ICR_EOI_NON_SPECIFIC, %al
56	cmpb	$IRQ_PIC_CUTOFF, undiisr_irq
57	jb	1f
58	outb	%al, $PIC2_ICR
591:	outb	%al, $PIC1_ICR
60	jmp	exit
61
62chain:	/* Chain to next handler */
63	pushfw
64	lcall	*undiisr_next_handler
65
66exit:	/* Restore registers and return */
67	cli
68	popal
69	movzwl	%sp, %esp
70	addr32	movl -20(%esp), %esp	/* %esp isn't restored by popal */
71	popfl
72	popw	%gs
73	popw	%fs
74	popw	%es
75	popw	%ds
76	iret
77
78	.section ".data16", "aw", @progbits
79undinet_params:
80status:			.word	0
81funcflag:		.word	0
82bufferlength:		.word	0
83framelength:		.word	0
84frameheaderlength:	.word	0
85frame:			.word	0, 0
86prottype:		.byte	0
87pkttype:		.byte	0
88