forked from ~ljy/RK356X_SDK_RELEASE

hc
2023-12-08 01573e231f18eb2d99162747186f59511f56b64d
kernel/arch/powerpc/kernel/head_fsl_booke.S
....@@ -1,3 +1,4 @@
1
+/* SPDX-License-Identifier: GPL-2.0-or-later */
12 /*
23 * Kernel execution entry point code.
34 *
....@@ -23,19 +24,14 @@
2324 * PowerPC 44x support, Matt Porter <mporter@kernel.crashing.org>
2425 * Copyright 2004 Freescale Semiconductor, Inc
2526 * PowerPC e500 modifications, Kumar Gala <galak@kernel.crashing.org>
26
- *
27
- * This program is free software; you can redistribute it and/or modify it
28
- * under the terms of the GNU General Public License as published by the
29
- * Free Software Foundation; either version 2 of the License, or (at your
30
- * option) any later version.
3127 */
3228
3329 #include <linux/init.h>
3430 #include <linux/threads.h>
31
+#include <linux/pgtable.h>
3532 #include <asm/processor.h>
3633 #include <asm/page.h>
3734 #include <asm/mmu.h>
38
-#include <asm/pgtable.h>
3935 #include <asm/cputable.h>
4036 #include <asm/thread_info.h>
4137 #include <asm/ppc_asm.h>
....@@ -159,6 +155,8 @@
159155 */
160156
161157 _ENTRY(__early_start)
158
+ LOAD_REG_ADDR_PIC(r20, kernstart_virt_addr)
159
+ lwz r20,0(r20)
162160
163161 #define ENTRY_MAPPING_BOOT_SETUP
164162 #include "fsl_booke_entry_mapping.S"
....@@ -193,13 +191,6 @@
193191 oris r2,r2,MAS4_TLBSELD(1)@h
194192 #endif
195193 mtspr SPRN_MAS4, r2
196
-
197
-#if 0
198
- /* Enable DOZE */
199
- mfspr r2,SPRN_HID0
200
- oris r2,r2,HID0_DOZE@h
201
- mtspr SPRN_HID0, r2
202
-#endif
203194
204195 #if !defined(CONFIG_BDI_SWITCH)
205196 /*
....@@ -243,11 +234,15 @@
243234 li r0,0
244235 stwu r0,THREAD_SIZE-STACK_FRAME_OVERHEAD(r1)
245236
246
- CURRENT_THREAD_INFO(r22, r1)
247
- stw r24, TI_CPU(r22)
237
+#ifdef CONFIG_SMP
238
+ stw r24, TASK_CPU(r2)
239
+#endif
248240
249241 bl early_init
250242
243
+#ifdef CONFIG_KASAN
244
+ bl kasan_early_init
245
+#endif
251246 #ifdef CONFIG_RELOCATABLE
252247 mr r3,r30
253248 mr r4,r31
....@@ -284,8 +279,8 @@
284279 ori r6, r6, swapper_pg_dir@l
285280 lis r5, abatron_pteptrs@h
286281 ori r5, r5, abatron_pteptrs@l
287
- lis r4, KERNELBASE@h
288
- ori r4, r4, KERNELBASE@l
282
+ lis r3, kernstart_virt_addr@ha
283
+ lwz r4, kernstart_virt_addr@l(r3)
289284 stw r5, 0(r4) /* Save abatron_pteptrs at a fixed location */
290285 stw r6, 0(r5)
291286
....@@ -383,10 +378,11 @@
383378 mfspr r4,SPRN_DEAR /* Grab the DEAR, save it, pass arg2 */
384379 andis. r10,r5,(ESR_ILK|ESR_DLK)@h
385380 bne 1f
381
+ stw r4, _DEAR(r11)
386382 EXC_XFER_LITE(0x0300, handle_page_fault)
387383 1:
388384 addi r3,r1,STACK_FRAME_OVERHEAD
389
- EXC_XFER_EE_LITE(0x0300, CacheLockingException)
385
+ EXC_XFER_LITE(0x0300, CacheLockingException)
390386
391387 /* Instruction Storage Interrupt */
392388 INSTRUCTION_STORAGE_EXCEPTION
....@@ -407,21 +403,20 @@
407403 #ifdef CONFIG_E200
408404 /* E200 treats 'normal' floating point instructions as FP Unavail exception */
409405 EXCEPTION(0x0800, FP_UNAVAIL, FloatingPointUnavailable, \
410
- program_check_exception, EXC_XFER_EE)
406
+ program_check_exception, EXC_XFER_STD)
411407 #else
412408 EXCEPTION(0x0800, FP_UNAVAIL, FloatingPointUnavailable, \
413
- unknown_exception, EXC_XFER_EE)
409
+ unknown_exception, EXC_XFER_STD)
414410 #endif
415411 #endif
416412
417413 /* System Call Interrupt */
418414 START_EXCEPTION(SystemCall)
419
- NORMAL_EXCEPTION_PROLOG(SYSCALL)
420
- EXC_XFER_EE_LITE(0x0c00, DoSyscall)
415
+ SYSCALL_ENTRY 0xc00 BOOKE_INTERRUPT_SYSCALL SPRN_SRR1
421416
422417 /* Auxiliary Processor Unavailable Interrupt */
423418 EXCEPTION(0x2900, AP_UNAVAIL, AuxillaryProcessorUnavailable, \
424
- unknown_exception, EXC_XFER_EE)
419
+ unknown_exception, EXC_XFER_STD)
425420
426421 /* Decrementer Interrupt */
427422 DECREMENTER_EXCEPTION
....@@ -429,7 +424,7 @@
429424 /* Fixed Internal Timer Interrupt */
430425 /* TODO: Add FIT support */
431426 EXCEPTION(0x3100, FIT, FixedIntervalTimer, \
432
- unknown_exception, EXC_XFER_EE)
427
+ unknown_exception, EXC_XFER_STD)
433428
434429 /* Watchdog Timer Interrupt */
435430 #ifdef CONFIG_BOOKE_WDT
....@@ -639,25 +634,25 @@
639634 bl load_up_spe
640635 b fast_exception_return
641636 1: addi r3,r1,STACK_FRAME_OVERHEAD
642
- EXC_XFER_EE_LITE(0x2010, KernelSPE)
637
+ EXC_XFER_LITE(0x2010, KernelSPE)
643638 #elif defined(CONFIG_SPE_POSSIBLE)
644639 EXCEPTION(0x2020, SPE_UNAVAIL, SPEUnavailable, \
645
- unknown_exception, EXC_XFER_EE)
640
+ unknown_exception, EXC_XFER_STD)
646641 #endif /* CONFIG_SPE_POSSIBLE */
647642
648643 /* SPE Floating Point Data */
649644 #ifdef CONFIG_SPE
650645 EXCEPTION(0x2030, SPE_FP_DATA, SPEFloatingPointData,
651
- SPEFloatingPointException, EXC_XFER_EE)
646
+ SPEFloatingPointException, EXC_XFER_STD)
652647
653648 /* SPE Floating Point Round */
654649 EXCEPTION(0x2050, SPE_FP_ROUND, SPEFloatingPointRound, \
655
- SPEFloatingPointRoundException, EXC_XFER_EE)
650
+ SPEFloatingPointRoundException, EXC_XFER_STD)
656651 #elif defined(CONFIG_SPE_POSSIBLE)
657652 EXCEPTION(0x2040, SPE_FP_DATA, SPEFloatingPointData,
658
- unknown_exception, EXC_XFER_EE)
653
+ unknown_exception, EXC_XFER_STD)
659654 EXCEPTION(0x2050, SPE_FP_ROUND, SPEFloatingPointRound, \
660
- unknown_exception, EXC_XFER_EE)
655
+ unknown_exception, EXC_XFER_STD)
661656 #endif /* CONFIG_SPE_POSSIBLE */
662657
663658
....@@ -680,10 +675,10 @@
680675 unknown_exception)
681676
682677 /* Hypercall */
683
- EXCEPTION(0, HV_SYSCALL, Hypercall, unknown_exception, EXC_XFER_EE)
678
+ EXCEPTION(0, HV_SYSCALL, Hypercall, unknown_exception, EXC_XFER_STD)
684679
685680 /* Embedded Hypervisor Privilege */
686
- EXCEPTION(0, HV_PRIV, Ehvpriv, unknown_exception, EXC_XFER_EE)
681
+ EXCEPTION(0, HV_PRIV, Ehvpriv, unknown_exception, EXC_XFER_STD)
687682
688683 interrupt_end:
689684
....@@ -717,8 +712,7 @@
717712
718713 /* Get the next_tlbcam_idx percpu var */
719714 #ifdef CONFIG_SMP
720
- lwz r12, THREAD_INFO-THREAD(r12)
721
- lwz r15, TI_CPU(r12)
715
+ lwz r15, TASK_CPU-THREAD(r12)
722716 lis r14, __per_cpu_offset@h
723717 ori r14, r14, __per_cpu_offset@l
724718 rlwinm r15, r15, 2, 0, 29
....@@ -1076,7 +1070,12 @@
10761070 mr r5,r25 /* phys kernel start */
10771071 rlwinm r5,r5,0,~0x3ffffff /* aligned 64M */
10781072 subf r4,r5,r4 /* memstart_addr - phys kernel start */
1079
- li r5,0 /* no device tree */
1073
+ lis r7,KERNELBASE@h
1074
+ ori r7,r7,KERNELBASE@l
1075
+ cmpw r20,r7 /* if kernstart_virt_addr != KERNELBASE, randomized */
1076
+ beq 2f
1077
+ li r4,0
1078
+2: li r5,0 /* no device tree */
10801079 li r6,0 /* not boot cpu */
10811080 bl restore_to_as0
10821081
....@@ -1089,10 +1088,10 @@
10891088 mr r4,r24 /* Why? */
10901089 bl call_setup_cpu
10911090
1092
- /* get current_thread_info and current */
1093
- lis r1,secondary_ti@ha
1094
- lwz r1,secondary_ti@l(r1)
1095
- lwz r2,TI_TASK(r1)
1091
+ /* get current's stack and current */
1092
+ lis r2,secondary_current@ha
1093
+ lwz r2,secondary_current@l(r2)
1094
+ lwz r1,TASK_STACK(r2)
10961095
10971096 /* stack */
10981097 addi r1,r1,THREAD_SIZE-STACK_FRAME_OVERHEAD
....@@ -1124,6 +1123,54 @@
11241123 #endif
11251124
11261125 /*
1126
+ * Create a 64M tlb by address and entry
1127
+ * r3 - entry
1128
+ * r4 - virtual address
1129
+ * r5/r6 - physical address
1130
+ */
1131
+_GLOBAL(create_kaslr_tlb_entry)
1132
+ lis r7,0x1000 /* Set MAS0(TLBSEL) = 1 */
1133
+ rlwimi r7,r3,16,4,15 /* Setup MAS0 = TLBSEL | ESEL(r6) */
1134
+ mtspr SPRN_MAS0,r7 /* Write MAS0 */
1135
+
1136
+ lis r3,(MAS1_VALID|MAS1_IPROT)@h
1137
+ ori r3,r3,(MAS1_TSIZE(BOOK3E_PAGESZ_64M))@l
1138
+ mtspr SPRN_MAS1,r3 /* Write MAS1 */
1139
+
1140
+ lis r3,MAS2_EPN_MASK(BOOK3E_PAGESZ_64M)@h
1141
+ ori r3,r3,MAS2_EPN_MASK(BOOK3E_PAGESZ_64M)@l
1142
+ and r3,r3,r4
1143
+ ori r3,r3,MAS2_M_IF_NEEDED@l
1144
+ mtspr SPRN_MAS2,r3 /* Write MAS2(EPN) */
1145
+
1146
+#ifdef CONFIG_PHYS_64BIT
1147
+ ori r8,r6,(MAS3_SW|MAS3_SR|MAS3_SX)
1148
+ mtspr SPRN_MAS3,r8 /* Write MAS3(RPN) */
1149
+ mtspr SPRN_MAS7,r5
1150
+#else
1151
+ ori r8,r5,(MAS3_SW|MAS3_SR|MAS3_SX)
1152
+ mtspr SPRN_MAS3,r8 /* Write MAS3(RPN) */
1153
+#endif
1154
+
1155
+ tlbwe /* Write TLB */
1156
+ isync
1157
+ sync
1158
+ blr
1159
+
1160
+/*
1161
+ * Return to the start of the relocated kernel and run again
1162
+ * r3 - virtual address of fdt
1163
+ * r4 - entry of the kernel
1164
+ */
1165
+_GLOBAL(reloc_kernel_entry)
1166
+ mfmsr r7
1167
+ rlwinm r7, r7, 0, ~(MSR_IS | MSR_DS)
1168
+
1169
+ mtspr SPRN_SRR0,r4
1170
+ mtspr SPRN_SRR1,r7
1171
+ rfi
1172
+
1173
+/*
11271174 * Create a tlb entry with the same effective and physical address as
11281175 * the tlb entry used by the current running code. But set the TS to 1.
11291176 * Then switch to the address space 1. It will return with the r3 set to