Browse Source

UNDI loader routine now works

tags/v0.9.3
Michael Brown 18 years ago
parent
commit
fa9055197d
1 changed files with 22 additions and 5 deletions
  1. 22
    5
      src/arch/i386/drivers/bus/pxedrv.c

+ 22
- 5
src/arch/i386/drivers/bus/pxedrv.c View File

22
 #include <pxe.h>
22
 #include <pxe.h>
23
 #include <realmode.h>
23
 #include <realmode.h>
24
 #include <bios.h>
24
 #include <bios.h>
25
+#include <pnpbios.h>
25
 
26
 
26
 /** @file
27
 /** @file
27
  *
28
  *
118
 static int pxedrv_probe_rom ( unsigned int rom_segment ) {
119
 static int pxedrv_probe_rom ( unsigned int rom_segment ) {
119
 	struct pxe_driver *pxedrv = NULL;
120
 	struct pxe_driver *pxedrv = NULL;
120
 	struct undi_rom rom;
121
 	struct undi_rom rom;
122
+	size_t rom_len;
121
 	unsigned int pxeromid;
123
 	unsigned int pxeromid;
122
 	unsigned int pcirheader;
124
 	unsigned int pcirheader;
123
 	int rc;
125
 	int rc;
128
 		rc = -EINVAL;
130
 		rc = -EINVAL;
129
 		goto err;
131
 		goto err;
130
 	}
132
 	}
133
+	rom_len = ( rom.ROMLength * 512 );
131
 
134
 
132
 	/* Allocate memory for PXE driver */
135
 	/* Allocate memory for PXE driver */
133
 	pxedrv = malloc ( sizeof ( *pxedrv ) );
136
 	pxedrv = malloc ( sizeof ( *pxedrv ) );
137
 		goto err;
140
 		goto err;
138
 	}
141
 	}
139
 	memset ( pxedrv, 0, sizeof ( *pxedrv ) );
142
 	memset ( pxedrv, 0, sizeof ( *pxedrv ) );
140
-	DBGC ( pxedrv, "PXEDRV %p using expansion ROM at %04x:0000 (%zdkB)\n",
141
-	       pxedrv, rom_segment, ( rom.ROMLength / 2 ) );
143
+	DBGC ( pxedrv, "PXEDRV %p trying expansion ROM at %04x:0000 (%zdkB)\n",
144
+	       pxedrv, rom_segment, ( rom_len / 1024 ) );
142
 	pxedrv->rom_segment = rom_segment;
145
 	pxedrv->rom_segment = rom_segment;
143
 
146
 
144
 	/* Check for and parse PXE ROM ID */
147
 	/* Check for and parse PXE ROM ID */
148
 		rc = -EINVAL;
151
 		rc = -EINVAL;
149
 		goto err;
152
 		goto err;
150
 	}
153
 	}
154
+	if ( pxeromid > rom_len ) {
155
+		DBGC ( pxedrv, "PXEDRV %p PXE ROM ID outside ROM\n", pxedrv );
156
+		rc = -EINVAL;
157
+		goto err;
158
+	}
151
 	if ( ( rc = pxedrv_parse_pxeromid ( pxedrv, pxeromid ) ) != 0 )
159
 	if ( ( rc = pxedrv_parse_pxeromid ( pxedrv, pxeromid ) ) != 0 )
152
 		goto err;
160
 		goto err;
153
 
161
 
245
 static int pxedrv_load ( struct pxe_driver *pxedrv, struct pxe_device *pxe,
253
 static int pxedrv_load ( struct pxe_driver *pxedrv, struct pxe_device *pxe,
246
 			 unsigned int pci_busdevfn, unsigned int isapnp_csn,
254
 			 unsigned int pci_busdevfn, unsigned int isapnp_csn,
247
 			 unsigned int isapnp_read_port ) {
255
 			 unsigned int isapnp_read_port ) {
248
-	int discard;
249
-	uint16_t exit;
256
+	int pnpbios_offset;
250
 	uint16_t fbms;
257
 	uint16_t fbms;
251
 	unsigned int fbms_seg;
258
 	unsigned int fbms_seg;
259
+	int discard;
260
+	uint16_t exit;
252
 	int rc;
261
 	int rc;
253
 
262
 
263
+	/* Record device location information */
254
 	memset ( &undi_loader, 0, sizeof ( undi_loader ) );
264
 	memset ( &undi_loader, 0, sizeof ( undi_loader ) );
255
 	undi_loader.AX = pci_busdevfn;
265
 	undi_loader.AX = pci_busdevfn;
256
 	undi_loader.BX = isapnp_csn;
266
 	undi_loader.BX = isapnp_csn;
257
 	undi_loader.DX = isapnp_read_port;
267
 	undi_loader.DX = isapnp_read_port;
258
 
268
 
269
+	/* Set up PnP BIOS pointer, if PnP BIOS present */
270
+	pnpbios_offset = find_pnp_bios();
271
+	if ( pnpbios_offset >= 0 ) {
272
+		undi_loader.ES = BIOS_SEG;
273
+		undi_loader.DI = pnpbios_offset;
274
+	}
275
+
259
 	/* Allocate base memory for PXE stack */
276
 	/* Allocate base memory for PXE stack */
260
 	get_real ( fbms, BDA_SEG, BDA_FBMS );
277
 	get_real ( fbms, BDA_SEG, BDA_FBMS );
261
 	fbms_seg = ( fbms << 6 );
278
 	fbms_seg = ( fbms << 6 );
279
 		rc = -undi_loader.Status;
296
 		rc = -undi_loader.Status;
280
 		if ( rc == 0 ) /* Paranoia */
297
 		if ( rc == 0 ) /* Paranoia */
281
 			rc = -EIO;
298
 			rc = -EIO;
282
-		DBGC ( pxedrv, "PXEDRV %p loader failed: %s\n",
299
+		DBGC ( pxedrv, "PXEDRV %p loader failed: %s\n", pxedrv,
283
 		       strerror ( rc ) );
300
 		       strerror ( rc ) );
284
 		return rc;
301
 		return rc;
285
 	}
302
 	}

Loading…
Cancel
Save