:: limine / common / sys / smp_trampoline.asm_loongarch64 2.1 KB raw

1
.section .text
2
3
.set tpl_booted_flag,   0
4
.set tpl_info_struct,   8
5
.set tpl_pgd_low,       16
6
.set tpl_pgd_high,      24
7
.set tpl_hhdm_offset,   32
8
.set tpl_temp_stack,    40
9
10
.global smp_trampoline_start
11
.extern loongarch_spinup
12
.extern loongarch_smp_passed_info
13
14
smp_trampoline_start:
15
        // Load trampoline state and switch to the kernel page tables.
16
        la.local $t0, loongarch_smp_passed_info
17
        la.local $a0, 1f
18
        ld.d    $a1, $t0, tpl_temp_stack
19
        ld.d    $a2, $t0, tpl_pgd_low
20
        ld.d    $a3, $t0, tpl_pgd_high
21
        b       loongarch_spinup
22
23
1:
24
        // Relocate the MP info pointer to the higher-half direct map.
25
        la.local $t0, loongarch_smp_passed_info
26
        ld.d    $t1, $t0, tpl_info_struct
27
        ld.d    $t2, $t0, tpl_hhdm_offset
28
        add.d   $t1, $t1, $t2
29
        move    $a0, $t1
30
31
        // Tell the BSP that this AP reached the parking loop.
32
        li.d    $t3, 1
33
        st.d    $t3, $t0, tpl_booted_flag
34
        dbar    0
35
36
2:
37
        // Wait until the kernel sets goto_address.
38
        ld.d    $t8, $t1, 24
39
        dbar    0
40
        beqz    $t8, 2b
41
42
        // Load the kernel-provided stack (reserved field).
43
        ld.d    $sp, $t1, 16
44
45
        // Save entry point in $t0 (matching BSP convention).
46
        move    $t0, $t8
47
48
        // Zero non-essential registers.
49
        move    $ra, $zero
50
        move    $tp, $zero
51
        move    $a1, $zero
52
        move    $a2, $zero
53
        move    $a3, $zero
54
        move    $a4, $zero
55
        move    $a5, $zero
56
        move    $a6, $zero
57
        move    $a7, $zero
58
        move    $t1, $zero
59
        move    $t2, $zero
60
        move    $t3, $zero
61
        move    $t4, $zero
62
        move    $t5, $zero
63
        move    $t6, $zero
64
        move    $t7, $zero
65
        move    $t8, $zero
66
        move    $r21, $zero
67
        move    $fp, $zero
68
        move    $s0, $zero
69
        move    $s1, $zero
70
        move    $s2, $zero
71
        move    $s3, $zero
72
        move    $s4, $zero
73
        move    $s5, $zero
74
        move    $s6, $zero
75
        move    $s7, $zero
76
        move    $s8, $zero
77
78
        jirl    $zero, $t0, 0
79
80
.section .note.GNU-stack,"",%progbits
tab: 248 wrap: offon