|
@@ -37,6 +37,7 @@
|
37
|
37
|
cld
|
38
|
38
|
/* Print welcome message */
|
39
|
39
|
movw $10f, %si
|
|
40
|
+ xorw %di, %di
|
40
|
41
|
call print_message
|
41
|
42
|
.section ".prefix.data"
|
42
|
43
|
10: .asciz "PXE->EB:"
|
|
@@ -48,24 +49,23 @@
|
48
|
49
|
*/
|
49
|
50
|
detect_pxenv:
|
50
|
51
|
/* Signature check */
|
51
|
|
- les pxenv_segoff, %di
|
52
|
|
- cmpl $0x4e455850, %es:(%di) /* 'PXEN' signature */
|
|
52
|
+ les pxenv_segoff, %bx
|
|
53
|
+ cmpl $0x4e455850, %es:(%bx) /* 'PXEN' signature */
|
53
|
54
|
jne no_pxenv
|
54
|
|
- cmpw $0x2b56, %es:4(%di) /* 'V+' signature */
|
|
55
|
+ cmpw $0x2b56, %es:4(%bx) /* 'V+' signature */
|
55
|
56
|
jne no_pxenv
|
56
|
57
|
/* Record entry point and UNDI segments */
|
57
|
|
- pushl %es:0x0a(%di) /* Entry point */
|
|
58
|
+ pushl %es:0x0a(%bx) /* Entry point */
|
58
|
59
|
popl entry_segoff
|
59
|
|
- pushw %es:0x24(%di) /* UNDI code segment */
|
60
|
|
- pushw %es:0x26(%di) /* UNDI code size */
|
|
60
|
+ pushw %es:0x24(%bx) /* UNDI code segment */
|
|
61
|
+ pushw %es:0x26(%bx) /* UNDI code size */
|
61
|
62
|
popl undi_code_segoff
|
62
|
|
- pushw %es:0x20(%di) /* UNDI data segment */
|
63
|
|
- pushw %es:0x22(%di) /* UNDI data size */
|
|
63
|
+ pushw %es:0x20(%bx) /* UNDI data segment */
|
|
64
|
+ pushw %es:0x22(%bx) /* UNDI data size */
|
64
|
65
|
popl undi_data_segoff
|
65
|
66
|
/* Print "PXENV+ at <address>" */
|
66
|
67
|
movw $10f, %si
|
67
|
68
|
call print_message
|
68
|
|
- movw %bx, %di
|
69
|
69
|
call print_segoff
|
70
|
70
|
movb $',', %al
|
71
|
71
|
call print_character
|
|
@@ -86,20 +86,20 @@ no_pxenv:
|
86
|
86
|
*/
|
87
|
87
|
detect_ppxe:
|
88
|
88
|
/* Signature check */
|
89
|
|
- les ppxe_segoff, %di
|
90
|
|
- cmpl $0x45585021, %es:(%di) /* '!PXE' signature */
|
|
89
|
+ les ppxe_segoff, %bx
|
|
90
|
+ cmpl $0x45585021, %es:(%bx) /* '!PXE' signature */
|
91
|
91
|
jne no_ppxe
|
92
|
92
|
/* Record structure address, entry point, and UNDI segments */
|
93
|
93
|
pushw %es
|
94
|
94
|
popw ppxe_segment
|
95
|
|
- movw %di, ppxe_offset
|
96
|
|
- pushl %es:0x10(%di) /* Entry point */
|
|
95
|
+ movw %bx, ppxe_offset
|
|
96
|
+ pushl %es:0x10(%bx) /* Entry point */
|
97
|
97
|
popl entry_segoff
|
98
|
|
- pushw %es:0x30(%di) /* UNDI code segment */
|
99
|
|
- pushw %es:0x36(%di) /* UNDI code size */
|
|
98
|
+ pushw %es:0x30(%bx) /* UNDI code segment */
|
|
99
|
+ pushw %es:0x36(%bx) /* UNDI code size */
|
100
|
100
|
popl undi_code_segoff
|
101
|
|
- pushw %es:0x28(%di) /* UNDI data segment */
|
102
|
|
- pushw %es:0x2e(%di) /* UNDI data size */
|
|
101
|
+ pushw %es:0x28(%bx) /* UNDI data segment */
|
|
102
|
+ pushw %es:0x2e(%bx) /* UNDI data size */
|
103
|
103
|
popl undi_data_segoff
|
104
|
104
|
/* Print "!PXE at <address>" */
|
105
|
105
|
movw $10f, %si
|
|
@@ -167,7 +167,7 @@ print_structure_information:
|
167
|
167
|
/* Print entry point */
|
168
|
168
|
movw $10f, %si
|
169
|
169
|
call print_message
|
170
|
|
- les entry_segoff, %di
|
|
170
|
+ les entry_segoff, %bx
|
171
|
171
|
call print_segoff
|
172
|
172
|
.section ".prefix.data"
|
173
|
173
|
10: .asciz " entry point at "
|
|
@@ -175,7 +175,7 @@ print_structure_information:
|
175
|
175
|
/* Print UNDI code segment */
|
176
|
176
|
movw $10f, %si
|
177
|
177
|
call print_message
|
178
|
|
- les undi_code_segoff, %di
|
|
178
|
+ les undi_code_segoff, %bx
|
179
|
179
|
call print_segoff
|
180
|
180
|
.section ".prefix.data"
|
181
|
181
|
10: .asciz "\n UNDI code segment "
|
|
@@ -183,7 +183,7 @@ print_structure_information:
|
183
|
183
|
/* Print UNDI data segment */
|
184
|
184
|
movw $10f, %si
|
185
|
185
|
call print_message
|
186
|
|
- les undi_data_segoff, %di
|
|
186
|
+ les undi_data_segoff, %bx
|
187
|
187
|
call print_segoff
|
188
|
188
|
.section ".prefix.data"
|
189
|
189
|
10: .asciz ", data segment "
|
|
@@ -271,8 +271,8 @@ unload_base_code:
|
271
|
271
|
call print_pxe_error
|
272
|
272
|
jmp 99f
|
273
|
273
|
1: /* Free base memory used by PXE base code */
|
274
|
|
- movw %fs:(0x13), %si
|
275
|
|
- movw undi_fbms_start, %di
|
|
274
|
+ movw undi_fbms_start, %ax
|
|
275
|
+ movw %fs:(0x13), %bx
|
276
|
276
|
call free_basemem
|
277
|
277
|
99:
|
278
|
278
|
|
|
@@ -289,8 +289,8 @@ unload_undi:
|
289
|
289
|
call print_pxe_error
|
290
|
290
|
jmp 99f
|
291
|
291
|
1: /* Free base memory used by UNDI */
|
292
|
|
- movw undi_fbms_start, %si
|
293
|
|
- movw undi_fbms_end, %di
|
|
292
|
+ movw undi_fbms_end, %ax
|
|
293
|
+ movw undi_fbms_start, %bx
|
294
|
294
|
call free_basemem
|
295
|
295
|
/* Clear UNDI_FL_STARTED */
|
296
|
296
|
andw $~UNDI_FL_STARTED, flags
|
|
@@ -324,9 +324,10 @@ finished:
|
324
|
324
|
* Subroutine: print segment:offset address
|
325
|
325
|
*
|
326
|
326
|
* Parameters:
|
327
|
|
- * %es:%di : segment:offset address to print
|
|
327
|
+ * %es:%bx : segment:offset address to print
|
|
328
|
+ * %ds:di : output buffer (or %di=0 to print to console)
|
328
|
329
|
* Returns:
|
329
|
|
- * Nothing
|
|
330
|
+ * %ds:di : next character in output buffer (if applicable)
|
330
|
331
|
*****************************************************************************
|
331
|
332
|
*/
|
332
|
333
|
print_segoff:
|
|
@@ -337,7 +338,7 @@ print_segoff:
|
337
|
338
|
call print_hex_word
|
338
|
339
|
movb $':', %al
|
339
|
340
|
call print_character
|
340
|
|
- movw %di, %ax
|
|
341
|
+ movw %bx, %ax
|
341
|
342
|
call print_hex_word
|
342
|
343
|
/* Restore registers and return */
|
343
|
344
|
popw %ax
|
|
@@ -348,8 +349,9 @@ print_segoff:
|
348
|
349
|
*
|
349
|
350
|
* Parameters:
|
350
|
351
|
* %ax : word to print
|
|
352
|
+ * %ds:di : output buffer (or %di=0 to print to console)
|
351
|
353
|
* Returns:
|
352
|
|
- * Nothing
|
|
354
|
+ * %ds:di : next character in output buffer (if applicable)
|
353
|
355
|
*****************************************************************************
|
354
|
356
|
*/
|
355
|
357
|
print_word:
|
|
@@ -378,44 +380,11 @@ print_word:
|
378
|
380
|
popw %ax
|
379
|
381
|
ret
|
380
|
382
|
|
381
|
|
-/*****************************************************************************
|
382
|
|
- * Subroutine: print PCI bus:dev.fn
|
383
|
|
- *
|
384
|
|
- * Parameters:
|
385
|
|
- * %ax : PCI bus:dev.fn to print
|
386
|
|
- * Returns:
|
387
|
|
- * Nothing
|
388
|
|
- *****************************************************************************
|
389
|
|
- */
|
390
|
|
-print_pci_busdevfn:
|
391
|
|
- /* Preserve registers */
|
392
|
|
- pushw %ax
|
393
|
|
- /* Print bus */
|
394
|
|
- xchgb %al, %ah
|
395
|
|
- call print_hex_byte
|
396
|
|
- /* Print ":" */
|
397
|
|
- movb $':', %al
|
398
|
|
- call print_character
|
399
|
|
- /* Print device */
|
400
|
|
- movb %ah, %al
|
401
|
|
- shrb $3, %al
|
402
|
|
- call print_hex_byte
|
403
|
|
- /* Print "." */
|
404
|
|
- movb $'.', %al
|
405
|
|
- call print_character
|
406
|
|
- /* Print function */
|
407
|
|
- movb %ah, %al
|
408
|
|
- andb $0x07, %al
|
409
|
|
- call print_hex_nibble
|
410
|
|
- /* Restore registers and return */
|
411
|
|
- popw %ax
|
412
|
|
- ret
|
413
|
|
-
|
414
|
383
|
/*****************************************************************************
|
415
|
384
|
* Subroutine: zero 1kB block of base memory
|
416
|
385
|
*
|
417
|
386
|
* Parameters:
|
418
|
|
- * %si : block to zero (in kB)
|
|
387
|
+ * %bx : block to zero (in kB)
|
419
|
388
|
* Returns:
|
420
|
389
|
* Nothing
|
421
|
390
|
*****************************************************************************
|
|
@@ -427,7 +396,7 @@ zero_kb:
|
427
|
396
|
pushw %di
|
428
|
397
|
pushw %es
|
429
|
398
|
/* Zero block */
|
430
|
|
- movw %si, %ax
|
|
399
|
+ movw %bx, %ax
|
431
|
400
|
shlw $6, %ax
|
432
|
401
|
movw %ax, %es
|
433
|
402
|
movw $0x400, %cx
|
|
@@ -445,33 +414,31 @@ zero_kb:
|
445
|
414
|
* Subroutine: free and zero base memory
|
446
|
415
|
*
|
447
|
416
|
* Parameters:
|
448
|
|
- * %si : Expected current free base memory counter (in kB)
|
449
|
|
- * %di : Desired new free base memory counter (in kB)
|
|
417
|
+ * %ax : Desired new free base memory counter (in kB)
|
|
418
|
+ * %bx : Expected current free base memory counter (in kB)
|
450
|
419
|
* %fs : BIOS data segment (0x40)
|
451
|
420
|
* Returns:
|
452
|
|
- * %ax : Actual new free base memory counter (in kB)
|
|
421
|
+ * None
|
453
|
422
|
*
|
454
|
|
- * The base memory from %si kB to %di kB is unconditionally zeroed.
|
|
423
|
+ * The base memory from %bx kB to %ax kB is unconditionally zeroed.
|
455
|
424
|
* It will be freed if and only if the expected current free base
|
456
|
|
- * memory counter (%si) matches the actual current free base memory
|
|
425
|
+ * memory counter (%bx) matches the actual current free base memory
|
457
|
426
|
* counter in 0x40:0x13; if this does not match then the memory will
|
458
|
427
|
* be leaked.
|
459
|
428
|
*****************************************************************************
|
460
|
429
|
*/
|
461
|
430
|
free_basemem:
|
462
|
431
|
/* Zero base memory */
|
463
|
|
- pushw %si
|
464
|
|
-1: cmpw %si, %di
|
|
432
|
+ pushw %bx
|
|
433
|
+1: cmpw %bx, %ax
|
465
|
434
|
je 2f
|
466
|
435
|
call zero_kb
|
467
|
|
- incw %si
|
|
436
|
+ incw %bx
|
468
|
437
|
jmp 1b
|
469
|
|
-2: popw %si
|
|
438
|
+2: popw %bx
|
470
|
439
|
/* Free base memory */
|
471
|
|
- movw %fs:(0x13), %ax /* Current FBMS to %ax */
|
472
|
|
- cmpw %ax, %si /* Update FBMS only if "old" value */
|
|
440
|
+ cmpw %fs:(0x13), %bx /* Update FBMS only if "old" value */
|
473
|
441
|
jne 1f /* is correct */
|
474
|
|
- movw %di, %ax
|
475
|
442
|
1: movw %ax, %fs:(0x13)
|
476
|
443
|
ret
|
477
|
444
|
|