|
@@ -37,7 +37,7 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )
|
37
|
37
|
* "non absolute segment" error. This is most probably a bug in gas.
|
38
|
38
|
****************************************************************************
|
39
|
39
|
*/
|
40
|
|
- .section ".data16", "aw", @progbits
|
|
40
|
+ .section ".data16.gdt", "aw", @progbits
|
41
|
41
|
.align 16
|
42
|
42
|
gdt:
|
43
|
43
|
gdtr: /* The first GDT entry is unused, the GDTR can fit here. */
|
|
@@ -89,7 +89,7 @@ gdt_end:
|
89
|
89
|
* %edi : Physical base of protected-mode code (virt_offset)
|
90
|
90
|
****************************************************************************
|
91
|
91
|
*/
|
92
|
|
- .section ".text16", "ax", @progbits
|
|
92
|
+ .section ".text16.init_librm", "ax", @progbits
|
93
|
93
|
.code16
|
94
|
94
|
.globl init_librm
|
95
|
95
|
init_librm:
|
|
@@ -141,7 +141,7 @@ init_librm:
|
141
|
141
|
popl %eax
|
142
|
142
|
lret
|
143
|
143
|
|
144
|
|
- .section ".text16", "ax", @progbits
|
|
144
|
+ .section ".text16.set_seg_base", "ax", @progbits
|
145
|
145
|
.code16
|
146
|
146
|
set_seg_base:
|
147
|
147
|
1: movw %ax, 2(%bx)
|
|
@@ -167,7 +167,7 @@ set_seg_base:
|
167
|
167
|
*
|
168
|
168
|
****************************************************************************
|
169
|
169
|
*/
|
170
|
|
- .section ".text16", "ax", @progbits
|
|
170
|
+ .section ".text16.real_to_prot", "ax", @progbits
|
171
|
171
|
.code16
|
172
|
172
|
real_to_prot:
|
173
|
173
|
/* Enable A20 line */
|
|
@@ -219,7 +219,7 @@ real_to_prot:
|
219
|
219
|
orb $CR0_PE, %al
|
220
|
220
|
movl %eax, %cr0
|
221
|
221
|
data32 ljmp $VIRTUAL_CS, $r2p_pmode
|
222
|
|
- .section ".text", "ax", @progbits
|
|
222
|
+ .section ".text.real_to_prot", "ax", @progbits
|
223
|
223
|
.code32
|
224
|
224
|
r2p_pmode:
|
225
|
225
|
/* Set up protected-mode data segments and stack pointer */
|
|
@@ -272,7 +272,7 @@ r2p_pmode:
|
272
|
272
|
*
|
273
|
273
|
****************************************************************************
|
274
|
274
|
*/
|
275
|
|
- .section ".text", "ax", @progbits
|
|
275
|
+ .section ".text.prot_to_real", "ax", @progbits
|
276
|
276
|
.code32
|
277
|
277
|
prot_to_real:
|
278
|
278
|
/* Copy real-mode global descriptor table register to RM code segment */
|
|
@@ -311,7 +311,7 @@ prot_to_real:
|
311
|
311
|
movw %ax, %gs
|
312
|
312
|
movw %ax, %ss
|
313
|
313
|
ljmp $REAL_CS, $p2r_rmode
|
314
|
|
- .section ".text16", "ax", @progbits
|
|
314
|
+ .section ".text16.prot_to_real", "ax", @progbits
|
315
|
315
|
.code16
|
316
|
316
|
p2r_rmode:
|
317
|
317
|
/* Load real-mode GDT */
|
|
@@ -347,12 +347,12 @@ p2r_ljmp_rm_cs:
|
347
|
347
|
.globl rm_cs
|
348
|
348
|
.equ rm_cs, ( p2r_ljmp_rm_cs + 3 )
|
349
|
349
|
|
350
|
|
- .section ".text16.data", "aw", @progbits
|
|
350
|
+ .section ".text16.data.rm_ds", "aw", @progbits
|
351
|
351
|
.globl rm_ds
|
352
|
352
|
rm_ds: .word 0
|
353
|
353
|
|
354
|
354
|
/* Real-mode global and interrupt descriptor table registers */
|
355
|
|
- .section ".text16.data", "aw", @progbits
|
|
355
|
+ .section ".text16.data.rm_gdtr", "aw", @progbits
|
356
|
356
|
rm_gdtr:
|
357
|
357
|
.word 0 /* Limit */
|
358
|
358
|
.long 0 /* Base */
|
|
@@ -398,7 +398,7 @@ rm_gdtr:
|
398
|
398
|
#define PC_OFFSET_FUNCTION ( PC_OFFSET_RETADDR + 4 )
|
399
|
399
|
#define PC_OFFSET_END ( PC_OFFSET_FUNCTION + 4 )
|
400
|
400
|
|
401
|
|
- .section ".text16", "ax", @progbits
|
|
401
|
+ .section ".text16.prot_call", "ax", @progbits
|
402
|
402
|
.code16
|
403
|
403
|
.globl prot_call
|
404
|
404
|
prot_call:
|
|
@@ -423,7 +423,7 @@ prot_call:
|
423
|
423
|
movl $PC_OFFSET_END, %ecx
|
424
|
424
|
pushl $pc_pmode
|
425
|
425
|
jmp real_to_prot
|
426
|
|
- .section ".text", "ax", @progbits
|
|
426
|
+ .section ".text.prot_call", "ax", @progbits
|
427
|
427
|
.code32
|
428
|
428
|
pc_pmode:
|
429
|
429
|
/* Call function */
|
|
@@ -437,7 +437,7 @@ pc_pmode:
|
437
|
437
|
movl %esp, %esi
|
438
|
438
|
pushl $pc_rmode
|
439
|
439
|
jmp prot_to_real
|
440
|
|
- .section ".text16", "ax", @progbits
|
|
440
|
+ .section ".text16.prot_call", "ax", @progbits
|
441
|
441
|
.code16
|
442
|
442
|
pc_rmode:
|
443
|
443
|
/* Restore registers and flags and return */
|
|
@@ -484,7 +484,7 @@ pc_rmode:
|
484
|
484
|
#define RC_OFFSET_FUNCTION ( RC_OFFSET_RETADDR + 4 )
|
485
|
485
|
#define RC_OFFSET_END ( RC_OFFSET_FUNCTION + 4 )
|
486
|
486
|
|
487
|
|
- .section ".text", "ax", @progbits
|
|
487
|
+ .section ".text.real_call", "ax", @progbits
|
488
|
488
|
.code32
|
489
|
489
|
.globl real_call
|
490
|
490
|
real_call:
|
|
@@ -497,7 +497,7 @@ real_call:
|
497
|
497
|
pushl $rc_rmode
|
498
|
498
|
movl $rm_default_gdtr_idtr, %esi
|
499
|
499
|
jmp prot_to_real
|
500
|
|
- .section ".text16", "ax", @progbits
|
|
500
|
+ .section ".text16.real_call", "ax", @progbits
|
501
|
501
|
.code16
|
502
|
502
|
rc_rmode:
|
503
|
503
|
/* Call real-mode function */
|
|
@@ -513,7 +513,7 @@ rc_rmode:
|
513
|
513
|
movl $RC_OFFSET_RETADDR, %ecx
|
514
|
514
|
pushl $rc_pmode
|
515
|
515
|
jmp real_to_prot
|
516
|
|
- .section ".text", "ax", @progbits
|
|
516
|
+ .section ".text.real_call", "ax", @progbits
|
517
|
517
|
.code32
|
518
|
518
|
rc_pmode:
|
519
|
519
|
/* Restore registers and return */
|
|
@@ -524,11 +524,11 @@ rc_pmode:
|
524
|
524
|
/* Function vector, used because "call xx(%sp)" is not a valid
|
525
|
525
|
* 16-bit expression.
|
526
|
526
|
*/
|
527
|
|
- .section ".data16", "aw", @progbits
|
|
527
|
+ .section ".bss16.rc_function", "aw", @nobits
|
528
|
528
|
rc_function: .word 0, 0
|
529
|
529
|
|
530
|
530
|
/* Default real-mode global and interrupt descriptor table registers */
|
531
|
|
- .section ".data", "aw", @progbits
|
|
531
|
+ .section ".data.rm_default_gdtr_idtr", "aw", @progbits
|
532
|
532
|
rm_default_gdtr_idtr:
|
533
|
533
|
.word 0 /* Global descriptor table limit */
|
534
|
534
|
.long 0 /* Global descriptor table base */
|
|
@@ -542,7 +542,7 @@ rm_default_gdtr_idtr:
|
542
|
542
|
*
|
543
|
543
|
****************************************************************************
|
544
|
544
|
*/
|
545
|
|
- .section ".text16", "ax", @progbits
|
|
545
|
+ .section ".text16.flatten_real_mode", "ax", @progbits
|
546
|
546
|
.code16
|
547
|
547
|
.globl flatten_real_mode
|
548
|
548
|
flatten_real_mode:
|
|
@@ -559,7 +559,7 @@ flatten_real_mode:
|
559
|
559
|
/* Return */
|
560
|
560
|
ret
|
561
|
561
|
|
562
|
|
- .section ".text", "ax", @progbits
|
|
562
|
+ .section ".text.flatten_dummy", "ax", @progbits
|
563
|
563
|
.code32
|
564
|
564
|
flatten_dummy:
|
565
|
565
|
ret
|
|
@@ -638,11 +638,15 @@ interrupt_wrapper:
|
638
|
638
|
* to us.
|
639
|
639
|
****************************************************************************
|
640
|
640
|
*/
|
641
|
|
- .section ".data", "aw", @progbits
|
|
641
|
+ .section ".bss.rm_sp", "aw", @nobits
|
642
|
642
|
.globl rm_sp
|
643
|
643
|
rm_sp: .word 0
|
|
644
|
+
|
|
645
|
+ .section ".bss.rm_ss", "aw", @nobits
|
644
|
646
|
.globl rm_ss
|
645
|
647
|
rm_ss: .word 0
|
|
648
|
+
|
|
649
|
+ .section ".data.pm_esp", "aw", @progbits
|
646
|
650
|
pm_esp: .long _estack
|
647
|
651
|
|
648
|
652
|
/****************************************************************************
|
|
@@ -654,13 +658,13 @@ pm_esp: .long _estack
|
654
|
658
|
****************************************************************************
|
655
|
659
|
*/
|
656
|
660
|
/* Internal copies, created by init_librm (which runs in real mode) */
|
657
|
|
- .section ".data16", "aw", @progbits
|
|
661
|
+ .section ".bss16.rm_virt_offset", "aw", @nobits
|
658
|
662
|
rm_virt_offset: .long 0
|
659
|
663
|
rm_text16: .long 0
|
660
|
664
|
rm_data16: .long 0
|
661
|
665
|
|
662
|
666
|
/* Externally-visible copies, created by real_to_prot */
|
663
|
|
- .section ".data", "aw", @progbits
|
|
667
|
+ .section ".bss.virt_offset", "aw", @nobits
|
664
|
668
|
.globl virt_offset
|
665
|
669
|
virt_offset: .long 0
|
666
|
670
|
.globl text16
|