Changeset 6e5252a in mainline for kernel/arch/ia32


Ignore:
Timestamp:
2018-11-13T20:22:20Z (7 years ago)
Author:
Jiří Zárevúcky <zarevucky.jiri@…>
Children:
156bae23
Parents:
2214382
git-author:
Jiří Zárevúcky <zarevucky.jiri@…> (2018-10-23 21:48:41)
git-committer:
Jiří Zárevúcky <zarevucky.jiri@…> (2018-11-13 20:22:20)
Message:

Place AP bootstrap correctly via linker script instead of manual copy

Location:
kernel/arch/ia32
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • kernel/arch/ia32/_link.ld.in

    r2214382 r6e5252a  
    1414ENTRY(multiboot_image_start)
    1515
     16PHDRS {
     17        ap_boot PT_LOAD ;
     18        unmapped PT_LOAD ;
     19        mapped PT_LOAD ;
     20}
     21
    1622SECTIONS {
    1723        kernel_load_address = PA2KA(BOOT_OFFSET);
    1824
    19         .unmapped (BOOT_OFFSET + SIZEOF_HEADERS): AT (BOOT_OFFSET + SIZEOF_HEADERS) {
     25        .ap_bootstrap (AP_BOOT_OFFSET): AT (AP_BOOT_OFFSET) {
     26                ap_bootstrap_start = .;
     27
     28                /* Must be first. */
     29                *(.multiboot);
     30
     31                *(K_AP_TEXT_START);
     32                *(K_AP_DATA_START);
     33                ap_bootstrap_end = .;
     34        } :ap_boot
     35
     36        .unmapped (BOOT_OFFSET): AT (BOOT_OFFSET) {
    2037                unmapped_start = .;
    2138                *(K_TEXT_START);
    2239                *(K_DATA_START);
    2340                unmapped_end = .;
    24         }
     41        } :unmapped
    2542
    26         .mapped (PA2KA(BOOT_OFFSET) + SIZEOF_HEADERS + SIZEOF(.unmapped)): AT (BOOT_OFFSET + SIZEOF_HEADERS + SIZEOF(.unmapped)) {
     43        .mapped (PA2KA(BOOT_OFFSET) + SIZEOF(.unmapped)): AT (BOOT_OFFSET + SIZEOF(.unmapped)) {
    2744                ktext_start = .;
    2845                *(.text .text.*);
     
    4158                *(symtab.*);            /* Symbol table, must be LAST symbol! */
    4259                kdata_end = .;
    43         }
     60        } :mapped
    4461
    4562#ifdef CONFIG_LINE_DEBUG
     
    6178
    6279#ifdef CONFIG_SMP
    63 
    64         ap_boot = unmapped_ap_boot - BOOT_OFFSET + AP_BOOT_OFFSET;
    65         ap_gdtr = unmapped_ap_gdtr - BOOT_OFFSET + AP_BOOT_OFFSET;
    6680        protected_ap_gdtr = PA2KA(ap_gdtr);
    67 
    6881#endif /* CONFIG_SMP */
    6982
  • kernel/arch/ia32/include/arch/boot/boot.h

    r2214382 r6e5252a  
    4444#ifdef CONFIG_SMP
    4545
    46 extern uint8_t unmapped_end[];
     46extern uint8_t ap_bootstrap_start[];
     47extern uint8_t ap_bootstrap_end[];
    4748
    4849#endif /* CONFIG_SMP */
  • kernel/arch/ia32/src/boot/multiboot.S

    r2214382 r6e5252a  
    4646#define START_STACK  (BOOT_OFFSET - BOOT_STACK_SIZE)
    4747
    48 .section K_TEXT_START, "ax"
    49 
    50 .code32
    51 
    52 .macro pm_status msg
    53 #if defined(CONFIG_EGA) && !defined(CONFIG_FB)
    54         pushl %esi
    55         movl \msg, %esi
    56         call pm_early_puts
    57         popl %esi
    58 #endif
    59 .endm
    60 
    61 .macro pm2_status msg
    62         pushl \msg
    63         call early_puts
    64 .endm
     48.section .multiboot, "a"
    6549
    6650.align 4
     
    8569        .long CONFIG_BFB_BPP
    8670#endif
     71
     72.section K_TEXT_START, "ax"
     73
     74.code32
     75
     76.macro pm_status msg
     77#if defined(CONFIG_EGA) && !defined(CONFIG_FB)
     78        pushl %esi
     79        movl \msg, %esi
     80        call pm_early_puts
     81        popl %esi
     82#endif
     83.endm
     84
     85.macro pm2_status msg
     86        pushl \msg
     87        call early_puts
     88.endm
    8789
    8890SYMBOL(multiboot_image_start)
  • kernel/arch/ia32/src/boot/multiboot2.S

    r2214382 r6e5252a  
    3333#include <genarch/multiboot/multiboot2.h>
    3434
    35 .section K_TEXT_START, "ax"
    36 
    37 .code32
     35.section .multiboot, "a"
    3836
    3937.align 8
  • kernel/arch/ia32/src/ia32.c

    r2214382 r6e5252a  
    9292        multiboot_info_parse(signature, (multiboot_info_t *) info);
    9393        multiboot2_info_parse(signature, (multiboot2_info_t *) info);
    94 
    95 #ifdef CONFIG_SMP
    96         size_t unmapped_size = (uintptr_t) unmapped_end - BOOT_OFFSET;
    97         /* Copy AP bootstrap routines below 1 MB. */
    98         memcpy((void *) AP_BOOT_OFFSET, (void *) BOOT_OFFSET, unmapped_size);
    99 #endif
    10094}
    10195
  • kernel/arch/ia32/src/mm/frame.c

    r2214382 r6e5252a  
    152152
    153153#ifdef CONFIG_SMP
    154                 size_t unmapped_size =
    155                     (uintptr_t) unmapped_end - BOOT_OFFSET;
    156 
    157                 minconf = max(minconf,
    158                     ADDR2PFN(AP_BOOT_OFFSET + unmapped_size));
     154                // FIXME: What is the purpose of minconf? Can we remove it?
     155                uintptr_t ap_end = ALIGN_UP((uintptr_t) ap_bootstrap_end, FRAME_SIZE);
     156                minconf = max(minconf, ADDR2PFN(ap_end));
    159157#endif
    160158
     
    165163
    166164#ifdef CONFIG_SMP
     165                // TODO: should go away implicitly with section table
     166
    167167                /* Reserve AP real mode bootstrap memory */
     168                size_t ap_size =
     169                    ALIGN_UP(ap_bootstrap_end - ap_bootstrap_start, FRAME_SIZE);
    168170                frame_mark_unavailable(AP_BOOT_OFFSET >> FRAME_WIDTH,
    169                     unmapped_size >> FRAME_WIDTH);
     171                    ap_size >> FRAME_WIDTH);
    170172#endif
    171173        }
  • kernel/arch/ia32/src/smp/ap.S

    r2214382 r6e5252a  
    4040#include <arch/context_struct.h>
    4141
    42 .section K_TEXT_START, "ax"
     42.section K_AP_TEXT_START, "ax"
    4343
    4444#ifdef CONFIG_SMP
     
    5454
    5555.align 4096
    56 SYMBOL(unmapped_ap_boot)
     56SYMBOL(ap_boot)
    5757.code16
    5858        cli
     
    6767        orl $CR0_PE, %eax
    6868        movl %eax, %cr0
    69         jmpl $KTEXT, $jump_to_kernel - BOOT_OFFSET + AP_BOOT_OFFSET
     69        jmpl $KTEXT, $jump_to_kernel
    7070
    7171jump_to_kernel:
     
    9696
    9797
    98 .section K_DATA_START, "aw", @progbits
     98.section K_AP_DATA_START, "aw", @progbits
    9999
    100100#ifdef CONFIG_SMP
    101101
    102 SYMBOL(unmapped_ap_gdtr)
     102SYMBOL(ap_gdtr)
    103103        .word 0
    104104        .long 0
Note: See TracChangeset for help on using the changeset viewer.