Changeset 6e5252a in mainline for kernel/arch/amd64


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/amd64
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • kernel/arch/amd64/_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);
     
    2340                *(K_INI_PTLS);
    2441                unmapped_end = .;
    25         }
     42        } :unmapped
    2643
    27         .mapped (PA2KA(BOOT_OFFSET) + SIZEOF_HEADERS + SIZEOF(.unmapped)) : AT (BOOT_OFFSET + SIZEOF_HEADERS + SIZEOF(.unmapped)) {
     44        .mapped (PA2KA(BOOT_OFFSET) + SIZEOF(.unmapped)) : AT (BOOT_OFFSET + SIZEOF(.unmapped)) {
    2845                ktext_start = .;
    2946                *(.text .text.*);
     
    4360
    4461                kdata_end = .;
    45         }
     62        } :mapped
    4663
    4764#ifdef CONFIG_LINE_DEBUG
     
    6380
    6481#ifdef CONFIG_SMP
    65         ap_boot = unmapped_ap_boot - BOOT_OFFSET + AP_BOOT_OFFSET;
    66         ap_gdtr = unmapped_ap_gdtr - BOOT_OFFSET + AP_BOOT_OFFSET;
    6782        protected_ap_gdtr = PA2KA(ap_gdtr);
    6883#endif /* CONFIG_SMP */
  • kernel/arch/amd64/include/arch/boot/boot.h

    r2214382 r6e5252a  
    4242#ifndef __ASSEMBLER__
    4343
    44 extern uint8_t unmapped_end[];
     44extern uint8_t ap_bootstrap_start[];
     45extern uint8_t ap_bootstrap_end[];
    4546
    4647#endif /* __ASSEMBLER__ */
  • kernel/arch/amd64/src/amd64.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/amd64/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_error msg
    53         movl \msg, %esi
    54         jmp pm_error_halt
    55 .endm
    56 
    57 .macro pm_status msg
    58 #if defined(CONFIG_EGA) && !defined(CONFIG_FB)
    59         pushl %esi
    60         movl \msg, %esi
    61         call pm_early_puts
    62         popl %esi
    63 #endif
    64 .endm
    65 
    66 .macro pm2_status msg
    67 #ifndef CONFIG_FB
    68         pm_status \msg
    69 #endif
    70 .endm
     48.section .multiboot, "a"
    7149
    7250.align 4
     
    9169        .long CONFIG_BFB_BPP
    9270#endif
     71
     72.section K_TEXT_START, "ax"
     73
     74.code32
     75
     76.macro pm_error msg
     77        movl \msg, %esi
     78        jmp pm_error_halt
     79.endm
     80
     81.macro pm_status msg
     82#if defined(CONFIG_EGA) && !defined(CONFIG_FB)
     83        pushl %esi
     84        movl \msg, %esi
     85        call pm_early_puts
     86        popl %esi
     87#endif
     88.endm
     89
     90.macro pm2_status msg
     91#ifndef CONFIG_FB
     92        pm_status \msg
     93#endif
     94.endm
    9395
    9496SYMBOL(multiboot_image_start)
  • kernel/arch/amd64/src/boot/multiboot2.S

    r2214382 r6e5252a  
    3535#include <genarch/multiboot/multiboot2.h>
    3636
    37 .section K_TEXT_START, "ax"
    38 
    39 .code32
     37.section .multiboot, "a"
    4038
    4139.align 8
  • kernel/arch/amd64/src/smp/ap.S

    r2214382 r6e5252a  
    4141#include <arch/context_struct.h>
    4242
    43 .section K_TEXT_START, "ax"
     43.section K_AP_TEXT_START, "ax"
    4444
    4545#ifdef CONFIG_SMP
     
    5050
    5151.align 4096
    52 SYMBOL(unmapped_ap_boot)
     52
     53SYMBOL(ap_boot)
    5354.code16
    5455        cli
     
    6162        orl $CR0_PE, %eax
    6263        movl %eax, %cr0     # switch to protected mode
    63         jmpl $GDT_SELECTOR(KTEXT32_DES), $jump_to_kernel - BOOT_OFFSET + AP_BOOT_OFFSET
     64        jmpl $GDT_SELECTOR(KTEXT32_DES), $jump_to_kernel
    6465
    6566jump_to_kernel:
     
    9495
    9596        # At this point we are in compatibility mode
    96         jmpl $GDT_SELECTOR(KTEXT_DES), $start64 - BOOT_OFFSET + AP_BOOT_OFFSET
     97        jmpl $GDT_SELECTOR(KTEXT_DES), $start64
    9798
    9899.code64
     
    109110#endif /* CONFIG_SMP */
    110111
    111 .section K_DATA_START, "aw", @progbits
     112.section K_AP_DATA_START, "aw", @progbits
    112113
    113114#ifdef CONFIG_SMP
    114115
    115 SYMBOL(unmapped_ap_gdtr)
     116SYMBOL(ap_gdtr)
    116117        .word 0
    117118        .long 0
Note: See TracChangeset for help on using the changeset viewer.