|
@@ -233,156 +233,128 @@ print_kill_line:
|
233
|
233
|
.size print_kill_line, . - print_kill_line
|
234
|
234
|
|
235
|
235
|
/****************************************************************************
|
236
|
|
- * pm_call (real-mode near call)
|
|
236
|
+ * flatten_real_mode
|
237
|
237
|
*
|
238
|
|
- * Call routine in 16-bit protected mode for access to extended memory
|
|
238
|
+ * Set up 4GB segment limits
|
239
|
239
|
*
|
240
|
240
|
* Parameters:
|
241
|
|
- * %ax : address of routine to call in 16-bit protected mode
|
|
241
|
+ * none
|
242
|
242
|
* Returns:
|
243
|
243
|
* none
|
244
|
244
|
* Corrupts:
|
245
|
|
- * %ax
|
246
|
|
- *
|
247
|
|
- * The specified routine is called in 16-bit protected mode, with:
|
248
|
|
- *
|
249
|
|
- * %cs : 16-bit code segment with base matching real-mode %cs
|
250
|
|
- * %ss : 16-bit data segment with base matching real-mode %ss
|
251
|
|
- * %ds,%es,%fs,%gs : 32-bit data segment with zero base and 4GB limit
|
252
|
|
- *
|
|
245
|
+ * none
|
253
|
246
|
****************************************************************************
|
254
|
247
|
*/
|
255
|
|
-
|
256
|
248
|
#ifndef KEEP_IT_REAL
|
257
|
249
|
|
258
|
250
|
/* GDT for protected-mode calls */
|
259
|
251
|
.section ".prefix.lib", "awx", @progbits
|
260
|
252
|
.align 16
|
261
|
|
-pm_call_vars:
|
262
|
|
-gdt:
|
263
|
|
-gdt_limit: .word gdt_length - 1
|
264
|
|
-gdt_base: .long 0
|
|
253
|
+flatten_vars:
|
|
254
|
+flatten_gdt:
|
|
255
|
+flatten_gdt_limit: .word flatten_gdt_length - 1
|
|
256
|
+flatten_gdt_base: .long 0
|
265
|
257
|
.word 0 /* padding */
|
266
|
|
-pm_cs: /* 16-bit protected-mode flat code segment */
|
267
|
|
- .equ PM_CS, pm_cs - gdt
|
|
258
|
+flatten_cs: /* 16-bit protected-mode flat code segment */
|
|
259
|
+ .equ FLAT_CS, flatten_cs - flatten_gdt
|
268
|
260
|
.word 0xffff, 0
|
269
|
261
|
.byte 0, 0x9b, 0x8f, 0
|
270
|
|
-pm_ss: /* 16-bit protected-mode flat stack segment */
|
271
|
|
- .equ PM_SS, pm_ss - gdt
|
|
262
|
+flatten_ss: /* 16-bit protected-mode flat stack segment */
|
|
263
|
+ .equ FLAT_SS, flatten_ss - flatten_gdt
|
272
|
264
|
.word 0xffff, 0
|
273
|
265
|
.byte 0, 0x93, 0x8f, 0
|
274
|
|
-pm_ds: /* 32-bit protected-mode flat data segment */
|
275
|
|
- .equ PM_DS, pm_ds - gdt
|
276
|
|
- .word 0xffff, 0
|
277
|
|
- .byte 0, 0x93, 0xcf, 0
|
278
|
|
-gdt_end:
|
279
|
|
- .equ gdt_length, . - gdt
|
280
|
|
- .size gdt, . - gdt
|
|
266
|
+flatten_gdt_end:
|
|
267
|
+ .equ flatten_gdt_length, . - flatten_gdt
|
|
268
|
+ .size flatten_gdt, . - flatten_gdt
|
281
|
269
|
|
282
|
270
|
.section ".prefix.lib", "awx", @progbits
|
283
|
271
|
.align 16
|
284
|
|
-pm_saved_gdt:
|
|
272
|
+flatten_saved_gdt:
|
285
|
273
|
.long 0, 0
|
286
|
|
- .size pm_saved_gdt, . - pm_saved_gdt
|
|
274
|
+ .size flatten_saved_gdt, . - flatten_saved_gdt
|
287
|
275
|
|
288
|
|
- .equ pm_call_vars_size, . - pm_call_vars
|
289
|
|
-#define PM_CALL_VAR(x) ( -pm_call_vars_size + ( (x) - pm_call_vars ) )
|
|
276
|
+ .equ flatten_vars_size, . - flatten_vars
|
|
277
|
+#define FLATTEN_VAR(x) ( -flatten_vars_size + ( (x) - flatten_vars ) )
|
290
|
278
|
|
291
|
279
|
.section ".prefix.lib", "awx", @progbits
|
292
|
280
|
.code16
|
293
|
|
-pm_call:
|
294
|
|
- /* Preserve registers, flags, and RM return point */
|
|
281
|
+flatten_real_mode:
|
|
282
|
+ /* Preserve registers and flags, allocate local variable block */
|
295
|
283
|
pushw %bp
|
296
|
284
|
movw %sp, %bp
|
297
|
|
- subw $pm_call_vars_size, %sp
|
|
285
|
+ subw $flatten_vars_size, %sp
|
298
|
286
|
andw $0xfff0, %sp
|
299
|
287
|
pushfl
|
|
288
|
+ pushl %eax
|
|
289
|
+ pushl %edi
|
|
290
|
+ pushw %si
|
|
291
|
+ pushw %cx
|
300
|
292
|
pushw %gs
|
301
|
293
|
pushw %fs
|
302
|
294
|
pushw %es
|
303
|
295
|
pushw %ds
|
304
|
296
|
pushw %ss
|
305
|
|
- pushw %cs
|
306
|
|
- pushw $99f
|
307
|
297
|
|
308
|
|
- /* Set up local variable block, and preserve GDT */
|
309
|
|
- pushw %cx
|
310
|
|
- pushw %si
|
311
|
|
- pushw %di
|
|
298
|
+ /* Fill local variable block and preserve GDT */
|
312
|
299
|
pushw %ss
|
313
|
300
|
popw %es
|
314
|
|
- movw $pm_call_vars, %si
|
315
|
|
- leaw PM_CALL_VAR(pm_call_vars)(%bp), %di
|
316
|
|
- movw $pm_call_vars_size, %cx
|
|
301
|
+ movw $flatten_vars, %si
|
|
302
|
+ leaw FLATTEN_VAR(flatten_vars)(%bp), %di
|
|
303
|
+ movw $flatten_vars_size, %cx
|
317
|
304
|
cs rep movsb
|
318
|
|
- popw %di
|
319
|
|
- popw %si
|
320
|
|
- popw %cx
|
321
|
|
- sgdt PM_CALL_VAR(pm_saved_gdt)(%bp)
|
|
305
|
+ sgdt FLATTEN_VAR(flatten_saved_gdt)(%bp)
|
322
|
306
|
|
323
|
307
|
/* Set up GDT bases */
|
324
|
|
- pushl %eax
|
325
|
|
- pushl %edi
|
326
|
308
|
xorl %eax, %eax
|
327
|
309
|
movw %ss, %ax
|
328
|
310
|
shll $4, %eax
|
329
|
311
|
movzwl %bp, %edi
|
330
|
|
- addr32 leal PM_CALL_VAR(gdt)(%eax, %edi), %eax
|
331
|
|
- movl %eax, PM_CALL_VAR(gdt_base)(%bp)
|
|
312
|
+ addr32 leal FLATTEN_VAR(flatten_gdt)(%eax, %edi), %eax
|
|
313
|
+ movl %eax, FLATTEN_VAR(flatten_gdt_base)(%bp)
|
332
|
314
|
movw %cs, %ax
|
333
|
|
- movw $PM_CALL_VAR(pm_cs), %di
|
|
315
|
+ movw $FLATTEN_VAR(flatten_cs), %di
|
334
|
316
|
call set_seg_base
|
335
|
317
|
movw %ss, %ax
|
336
|
|
- movw $PM_CALL_VAR(pm_ss), %di
|
|
318
|
+ movw $FLATTEN_VAR(flatten_ss), %di
|
337
|
319
|
call set_seg_base
|
338
|
|
- popl %edi
|
339
|
|
- popl %eax
|
340
|
320
|
|
341
|
|
- /* Switch CPU to protected mode and load up segment registers */
|
342
|
|
- pushl %eax
|
|
321
|
+ /* Switch temporarily to protected mode and set segment registers */
|
|
322
|
+ pushw %cs
|
|
323
|
+ pushw $2f
|
343
|
324
|
cli
|
344
|
|
- data32 lgdt PM_CALL_VAR(gdt)(%bp)
|
|
325
|
+ data32 lgdt FLATTEN_VAR(flatten_gdt)(%bp)
|
345
|
326
|
movl %cr0, %eax
|
346
|
327
|
orb $CR0_PE, %al
|
347
|
328
|
movl %eax, %cr0
|
348
|
|
- ljmp $PM_CS, $1f
|
349
|
|
-1: movw $PM_SS, %ax
|
|
329
|
+ ljmp $FLAT_CS, $1f
|
|
330
|
+1: movw $FLAT_SS, %ax
|
350
|
331
|
movw %ax, %ss
|
351
|
|
- movw $PM_DS, %ax
|
352
|
|
- movw %ax, %ds
|
353
|
|
- movw %ax, %es
|
354
|
|
- movw %ax, %fs
|
355
|
|
- movw %ax, %gs
|
356
|
|
- popl %eax
|
357
|
|
-
|
358
|
|
- /* Call PM routine */
|
359
|
|
- call *%ax
|
360
|
|
-
|
361
|
|
- /* Set real-mode segment limits on %ds, %es, %fs and %gs */
|
362
|
|
- movw %ss, %ax
|
363
|
332
|
movw %ax, %ds
|
364
|
333
|
movw %ax, %es
|
365
|
334
|
movw %ax, %fs
|
366
|
335
|
movw %ax, %gs
|
367
|
|
-
|
368
|
|
- /* Return CPU to real mode */
|
369
|
336
|
movl %cr0, %eax
|
370
|
337
|
andb $0!CR0_PE, %al
|
371
|
338
|
movl %eax, %cr0
|
|
339
|
+ lret
|
|
340
|
+2: /* lret will ljmp to here */
|
372
|
341
|
|
373
|
|
- /* Restore registers and flags */
|
374
|
|
- lret /* will ljmp to 99f */
|
375
|
|
-99: popw %ss
|
|
342
|
+ /* Restore GDT, registers and flags */
|
|
343
|
+ data32 lgdt FLATTEN_VAR(flatten_saved_gdt)(%bp)
|
|
344
|
+ popw %ss
|
376
|
345
|
popw %ds
|
377
|
346
|
popw %es
|
378
|
347
|
popw %fs
|
379
|
348
|
popw %gs
|
380
|
|
- data32 lgdt PM_CALL_VAR(pm_saved_gdt)(%bp)
|
|
349
|
+ popw %cx
|
|
350
|
+ popw %si
|
|
351
|
+ popl %edi
|
|
352
|
+ popl %eax
|
381
|
353
|
popfl
|
382
|
354
|
movw %bp, %sp
|
383
|
355
|
popw %bp
|
384
|
356
|
ret
|
385
|
|
- .size pm_call, . - pm_call
|
|
357
|
+ .size flatten_real_mode, . - flatten_real_mode
|
386
|
358
|
|
387
|
359
|
set_seg_base:
|
388
|
360
|
rolw $4, %ax
|
|
@@ -396,7 +368,7 @@ set_seg_base:
|
396
|
368
|
#endif /* KEEP_IT_REAL */
|
397
|
369
|
|
398
|
370
|
/****************************************************************************
|
399
|
|
- * copy_bytes (real-mode or 16-bit protected-mode near call)
|
|
371
|
+ * copy_bytes
|
400
|
372
|
*
|
401
|
373
|
* Copy bytes
|
402
|
374
|
*
|
|
@@ -411,6 +383,7 @@ set_seg_base:
|
411
|
383
|
* None
|
412
|
384
|
****************************************************************************
|
413
|
385
|
*/
|
|
386
|
+#if ! COMPRESS
|
414
|
387
|
.section ".prefix.lib", "awx", @progbits
|
415
|
388
|
.code16
|
416
|
389
|
copy_bytes:
|
|
@@ -419,9 +392,10 @@ copy_bytes:
|
419
|
392
|
popl %ecx
|
420
|
393
|
ret
|
421
|
394
|
.size copy_bytes, . - copy_bytes
|
|
395
|
+#endif /* COMPRESS */
|
422
|
396
|
|
423
|
397
|
/****************************************************************************
|
424
|
|
- * install_block (real-mode near call)
|
|
398
|
+ * install_block
|
425
|
399
|
*
|
426
|
400
|
* Install block to specified address
|
427
|
401
|
*
|
|
@@ -439,39 +413,22 @@ copy_bytes:
|
439
|
413
|
.section ".prefix.lib", "awx", @progbits
|
440
|
414
|
.code16
|
441
|
415
|
install_block:
|
442
|
|
-
|
443
|
|
-#ifdef KEEP_IT_REAL
|
444
|
|
-
|
445
|
416
|
/* Preserve registers */
|
446
|
417
|
pushw %ds
|
447
|
418
|
pushw %es
|
448
|
419
|
pushl %ecx
|
449
|
420
|
pushl %edi
|
450
|
421
|
|
451
|
|
- /* Convert %esi and %edi to segment registers */
|
|
422
|
+ /* Convert %esi and %edi to %ds:esi and %es:edi */
|
452
|
423
|
shrl $4, %esi
|
453
|
424
|
movw %si, %ds
|
454
|
425
|
xorw %si, %si
|
|
426
|
+ shll $4, %esi
|
455
|
427
|
shrl $4, %edi
|
456
|
428
|
movw %di, %es
|
457
|
429
|
xorw %di, %di
|
|
430
|
+ shll $4, %edi
|
458
|
431
|
|
459
|
|
-#else /* KEEP_IT_REAL */
|
460
|
|
-
|
461
|
|
- /* Call self in protected mode */
|
462
|
|
- pushw %ax
|
463
|
|
- movw $1f, %ax
|
464
|
|
- call pm_call
|
465
|
|
- popw %ax
|
466
|
|
- ret
|
467
|
|
-1:
|
468
|
|
- /* Preserve registers */
|
469
|
|
- pushl %ecx
|
470
|
|
- pushl %edi
|
471
|
|
-
|
472
|
|
-#endif /* KEEP_IT_REAL */
|
473
|
|
-
|
474
|
|
-
|
475
|
432
|
#if COMPRESS
|
476
|
433
|
/* Decompress source to destination */
|
477
|
434
|
call decompress16
|
|
@@ -492,33 +449,22 @@ install_block:
|
492
|
449
|
addl $0xf, %esi
|
493
|
450
|
andl $~0xf, %esi
|
494
|
451
|
|
495
|
|
-
|
496
|
|
-#ifdef KEEP_IT_REAL
|
497
|
|
-
|
498
|
452
|
/* Convert %ds:esi back to a physical address */
|
499
|
|
- movzwl %ds, %cx
|
|
453
|
+ xorl %ecx, %ecx
|
|
454
|
+ movw %ds, %cx
|
500
|
455
|
shll $4, %ecx
|
501
|
456
|
addl %ecx, %esi
|
502
|
457
|
|
503
|
|
- /* Restore registers */
|
|
458
|
+ /* Restore registers and return */
|
504
|
459
|
popl %edi
|
505
|
460
|
popl %ecx
|
506
|
461
|
popw %es
|
507
|
462
|
popw %ds
|
508
|
|
-
|
509
|
|
-#else /* KEEP_IT_REAL */
|
510
|
|
-
|
511
|
|
- /* Restore registers */
|
512
|
|
- popl %edi
|
513
|
|
- popl %ecx
|
514
|
|
-
|
515
|
|
-#endif
|
516
|
|
-
|
517
|
463
|
ret
|
518
|
464
|
.size install_block, . - install_block
|
519
|
|
-
|
|
465
|
+
|
520
|
466
|
/****************************************************************************
|
521
|
|
- * alloc_basemem (real-mode near call)
|
|
467
|
+ * alloc_basemem
|
522
|
468
|
*
|
523
|
469
|
* Allocate space for .text16 and .data16 from top of base memory.
|
524
|
470
|
* Memory is allocated using the BIOS free base memory counter at
|
|
@@ -568,7 +514,7 @@ alloc_basemem:
|
568
|
514
|
.size alloc_basemem, . - alloc_basemem
|
569
|
515
|
|
570
|
516
|
/****************************************************************************
|
571
|
|
- * free_basemem (real-mode near call)
|
|
517
|
+ * free_basemem
|
572
|
518
|
*
|
573
|
519
|
* Free space allocated with alloc_basemem.
|
574
|
520
|
*
|
|
@@ -620,7 +566,7 @@ hooked_bios_interrupts:
|
620
|
566
|
.size hooked_bios_interrupts, . - hooked_bios_interrupts
|
621
|
567
|
|
622
|
568
|
/****************************************************************************
|
623
|
|
- * install (real-mode near call)
|
|
569
|
+ * install
|
624
|
570
|
*
|
625
|
571
|
* Install all text and data segments.
|
626
|
572
|
*
|
|
@@ -655,7 +601,7 @@ install:
|
655
|
601
|
.size install, . - install
|
656
|
602
|
|
657
|
603
|
/****************************************************************************
|
658
|
|
- * install_prealloc (real-mode near call)
|
|
604
|
+ * install_prealloc
|
659
|
605
|
*
|
660
|
606
|
* Install all text and data segments.
|
661
|
607
|
*
|
|
@@ -680,6 +626,11 @@ install_prealloc:
|
680
|
626
|
/* Sanity: clear the direction flag asap */
|
681
|
627
|
cld
|
682
|
628
|
|
|
629
|
+#ifndef KEEP_IT_REAL
|
|
630
|
+ /* Flatten real mode */
|
|
631
|
+ call flatten_real_mode
|
|
632
|
+#endif
|
|
633
|
+
|
683
|
634
|
/* Calculate physical address of payload (i.e. first source) */
|
684
|
635
|
testl %esi, %esi
|
685
|
636
|
jnz 1f
|
|
@@ -732,16 +683,15 @@ install_prealloc:
|
732
|
683
|
|
733
|
684
|
/* Copy code to new location */
|
734
|
685
|
pushl %edi
|
735
|
|
- pushw %ax
|
736
|
|
- movw $copy_bytes, %ax
|
737
|
|
- call pm_call
|
738
|
|
- popw %ax
|
|
686
|
+ xorw %ax, %ax
|
|
687
|
+ movw %ax, %es
|
|
688
|
+ es rep addr32 movsb
|
739
|
689
|
popl %edi
|
740
|
690
|
|
741
|
691
|
/* Initialise librm at new location */
|
742
|
692
|
lcall *init_librm_vector
|
743
|
|
-
|
744
|
693
|
#endif
|
|
694
|
+
|
745
|
695
|
/* Restore registers */
|
746
|
696
|
popw %es
|
747
|
697
|
popw %ds
|
|
@@ -749,7 +699,9 @@ install_prealloc:
|
749
|
699
|
ret
|
750
|
700
|
.size install_prealloc, . - install_prealloc
|
751
|
701
|
|
752
|
|
- /* Vectors for far calls to .text16 functions */
|
|
702
|
+ /* Vectors for far calls to .text16 functions. Must be in
|
|
703
|
+ * .data16, since .prefix may not be writable.
|
|
704
|
+ */
|
753
|
705
|
.section ".data16", "aw", @progbits
|
754
|
706
|
#ifdef KEEP_IT_REAL
|
755
|
707
|
init_libkir_vector:
|
|
@@ -768,7 +720,7 @@ prot_call_vector:
|
768
|
720
|
#endif
|
769
|
721
|
|
770
|
722
|
/****************************************************************************
|
771
|
|
- * uninstall (real-mode near call)
|
|
723
|
+ * uninstall
|
772
|
724
|
*
|
773
|
725
|
* Uninstall all text and data segments.
|
774
|
726
|
*
|