~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/arch/mips/kernel/relocate_kernel.S

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.12 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

Diff markup

Differences between /arch/mips/kernel/relocate_kernel.S (Architecture sparc64) and /arch/mips/kernel/relocate_kernel.S (Architecture mips)


  1 /* SPDX-License-Identifier: GPL-2.0-only */         1 /* SPDX-License-Identifier: GPL-2.0-only */
  2 /*                                                  2 /*
  3  * relocate_kernel.S for kexec                      3  * relocate_kernel.S for kexec
  4  * Created by <nschichan@corp.free.fr> on Thu O      4  * Created by <nschichan@corp.free.fr> on Thu Oct 12 17:49:57 2006
  5  */                                                 5  */
  6                                                     6 
  7 #include <asm/asm.h>                                7 #include <asm/asm.h>
  8 #include <asm/asmmacro.h>                           8 #include <asm/asmmacro.h>
  9 #include <asm/regdef.h>                             9 #include <asm/regdef.h>
 10 #include <asm/mipsregs.h>                          10 #include <asm/mipsregs.h>
 11 #include <asm/stackframe.h>                        11 #include <asm/stackframe.h>
 12 #include <asm/addrspace.h>                         12 #include <asm/addrspace.h>
 13                                                    13 
 14 #include <kernel-entry-init.h>                     14 #include <kernel-entry-init.h>
 15                                                    15 
 16 LEAF(relocate_new_kernel)                          16 LEAF(relocate_new_kernel)
 17         PTR_L a0,       arg0                       17         PTR_L a0,       arg0
 18         PTR_L a1,       arg1                       18         PTR_L a1,       arg1
 19         PTR_L a2,       arg2                       19         PTR_L a2,       arg2
 20         PTR_L a3,       arg3                       20         PTR_L a3,       arg3
 21                                                    21 
 22         PTR_L           s0, kexec_indirection_     22         PTR_L           s0, kexec_indirection_page
 23         PTR_L           s1, kexec_start_addres     23         PTR_L           s1, kexec_start_address
 24                                                    24 
 25 process_entry:                                     25 process_entry:
 26         PTR_L           s2, (s0)                   26         PTR_L           s2, (s0)
 27         PTR_ADDIU       s0, s0, SZREG              27         PTR_ADDIU       s0, s0, SZREG
 28                                                    28 
 29         /*                                         29         /*
 30          * In case of a kdump/crash kernel, th     30          * In case of a kdump/crash kernel, the indirection page is not
 31          * populated as the kernel is directly     31          * populated as the kernel is directly copied to a reserved location
 32          */                                        32          */
 33         beqz            s2, done                   33         beqz            s2, done
 34                                                    34 
 35         /* destination page */                     35         /* destination page */
 36         and             s3, s2, 0x1                36         and             s3, s2, 0x1
 37         beq             s3, zero, 1f               37         beq             s3, zero, 1f
 38         and             s4, s2, ~0x1    /* sto     38         and             s4, s2, ~0x1    /* store destination addr in s4 */
 39         b               process_entry              39         b               process_entry
 40                                                    40 
 41 1:                                                 41 1:
 42         /* indirection page, update s0  */         42         /* indirection page, update s0  */
 43         and             s3, s2, 0x2                43         and             s3, s2, 0x2
 44         beq             s3, zero, 1f               44         beq             s3, zero, 1f
 45         and             s0, s2, ~0x2               45         and             s0, s2, ~0x2
 46         b               process_entry              46         b               process_entry
 47                                                    47 
 48 1:                                                 48 1:
 49         /* done page */                            49         /* done page */
 50         and             s3, s2, 0x4                50         and             s3, s2, 0x4
 51         beq             s3, zero, 1f               51         beq             s3, zero, 1f
 52         b               done                       52         b               done
 53 1:                                                 53 1:
 54         /* source page */                          54         /* source page */
 55         and             s3, s2, 0x8                55         and             s3, s2, 0x8
 56         beq             s3, zero, process_entr     56         beq             s3, zero, process_entry
 57         and             s2, s2, ~0x8               57         and             s2, s2, ~0x8
 58         li              s6, (1 << _PAGE_SHIFT)     58         li              s6, (1 << _PAGE_SHIFT) / SZREG
 59                                                    59 
 60 copy_word:                                         60 copy_word:
 61         /* copy page word by word */               61         /* copy page word by word */
 62         REG_L           s5, (s2)                   62         REG_L           s5, (s2)
 63         REG_S           s5, (s4)                   63         REG_S           s5, (s4)
 64         PTR_ADDIU       s4, s4, SZREG              64         PTR_ADDIU       s4, s4, SZREG
 65         PTR_ADDIU       s2, s2, SZREG              65         PTR_ADDIU       s2, s2, SZREG
 66         LONG_ADDIU      s6, s6, -1                 66         LONG_ADDIU      s6, s6, -1
 67         beq             s6, zero, process_entr     67         beq             s6, zero, process_entry
 68         b               copy_word                  68         b               copy_word
 69                                                    69 
 70 done:                                              70 done:
 71 #ifdef CONFIG_SMP                                  71 #ifdef CONFIG_SMP
 72         /* kexec_flag reset is signal to other     72         /* kexec_flag reset is signal to other CPUs what kernel
 73            was moved to its location. Note - w     73            was moved to its location. Note - we need relocated address
 74            of kexec_flag.  */                      74            of kexec_flag.  */
 75                                                    75 
 76         bal             1f                         76         bal             1f
 77  1:     move            t1,ra;                     77  1:     move            t1,ra;
 78         PTR_LA          t2,1b                      78         PTR_LA          t2,1b
 79         PTR_LA          t0,kexec_flag              79         PTR_LA          t0,kexec_flag
 80         PTR_SUB         t0,t0,t2;                  80         PTR_SUB         t0,t0,t2;
 81         PTR_ADD         t0,t1,t0;                  81         PTR_ADD         t0,t1,t0;
 82         LONG_S          zero,(t0)                  82         LONG_S          zero,(t0)
 83 #endif                                             83 #endif
 84                                                    84 
 85 #ifdef CONFIG_CPU_CAVIUM_OCTEON                    85 #ifdef CONFIG_CPU_CAVIUM_OCTEON
 86         /* We need to flush I-cache before jum     86         /* We need to flush I-cache before jumping to new kernel.
 87          * Unfortunately, this code is cpu-spe     87          * Unfortunately, this code is cpu-specific.
 88          */                                        88          */
 89         .set push                                  89         .set push
 90         .set noreorder                             90         .set noreorder
 91         syncw                                      91         syncw
 92         syncw                                      92         syncw
 93         synci           0($0)                      93         synci           0($0)
 94         .set pop                                   94         .set pop
 95 #else                                              95 #else
 96         sync                                       96         sync
 97 #endif                                             97 #endif
 98         /* jump to kexec_start_address */          98         /* jump to kexec_start_address */
 99         j               s1                         99         j               s1
100         END(relocate_new_kernel)                  100         END(relocate_new_kernel)
101                                                   101 
102 #ifdef CONFIG_SMP                                 102 #ifdef CONFIG_SMP
103 /*                                                103 /*
104  * Other CPUs should wait until code is reloca    104  * Other CPUs should wait until code is relocated and
105  * then start at entry (?) point.                 105  * then start at entry (?) point.
106  */                                               106  */
107 LEAF(kexec_smp_wait)                              107 LEAF(kexec_smp_wait)
108         PTR_L           a0, s_arg0                108         PTR_L           a0, s_arg0
109         PTR_L           a1, s_arg1                109         PTR_L           a1, s_arg1
110         PTR_L           a2, s_arg2                110         PTR_L           a2, s_arg2
111         PTR_L           a3, s_arg3                111         PTR_L           a3, s_arg3
112         PTR_L           s1, kexec_start_addres    112         PTR_L           s1, kexec_start_address
113                                                   113 
114         /* Non-relocated address works for arg    114         /* Non-relocated address works for args and kexec_start_address ( old
115          * kernel is not overwritten). But we     115          * kernel is not overwritten). But we need relocated address of
116          * kexec_flag.                            116          * kexec_flag.
117          */                                       117          */
118                                                   118 
119         bal             1f                        119         bal             1f
120 1:      move            t1,ra;                    120 1:      move            t1,ra;
121         PTR_LA          t2,1b                     121         PTR_LA          t2,1b
122         PTR_LA          t0,kexec_flag             122         PTR_LA          t0,kexec_flag
123         PTR_SUB         t0,t0,t2;                 123         PTR_SUB         t0,t0,t2;
124         PTR_ADD         t0,t1,t0;                 124         PTR_ADD         t0,t1,t0;
125                                                   125 
126 1:      LONG_L          s0, (t0)                  126 1:      LONG_L          s0, (t0)
127         bne             s0, zero,1b               127         bne             s0, zero,1b
128                                                   128 
129 #ifdef USE_KEXEC_SMP_WAIT_FINAL                   129 #ifdef USE_KEXEC_SMP_WAIT_FINAL
130         kexec_smp_wait_final                      130         kexec_smp_wait_final
131 #else                                             131 #else
132         sync                                      132         sync
133 #endif                                            133 #endif
134         j               s1                        134         j               s1
135         END(kexec_smp_wait)                       135         END(kexec_smp_wait)
136 #endif                                            136 #endif
137                                                   137 
138 #ifdef __mips64                                   138 #ifdef __mips64
139        /* all PTR's must be aligned to 8 byte     139        /* all PTR's must be aligned to 8 byte in 64-bit mode */
140        .align  3                                  140        .align  3
141 #endif                                            141 #endif
142                                                   142 
143 /* All parameters to new kernel are passed in     143 /* All parameters to new kernel are passed in registers a0-a3.
144  * kexec_args[0..3] are used to prepare regist    144  * kexec_args[0..3] are used to prepare register values.
145  */                                               145  */
146                                                   146 
147 EXPORT(kexec_args)                                147 EXPORT(kexec_args)
148 arg0:   PTR_WD          0x0                       148 arg0:   PTR_WD          0x0
149 arg1:   PTR_WD          0x0                       149 arg1:   PTR_WD          0x0
150 arg2:   PTR_WD          0x0                       150 arg2:   PTR_WD          0x0
151 arg3:   PTR_WD          0x0                       151 arg3:   PTR_WD          0x0
152         .size   kexec_args,PTRSIZE*4              152         .size   kexec_args,PTRSIZE*4
153                                                   153 
154 #ifdef CONFIG_SMP                                 154 #ifdef CONFIG_SMP
155 /*                                                155 /*
156  * Secondary CPUs may have different kernel pa    156  * Secondary CPUs may have different kernel parameters in
157  * their registers a0-a3. secondary_kexec_args    157  * their registers a0-a3. secondary_kexec_args[0..3] are used
158  * to prepare register values.                    158  * to prepare register values.
159  */                                               159  */
160 EXPORT(secondary_kexec_args)                      160 EXPORT(secondary_kexec_args)
161 s_arg0: PTR_WD          0x0                       161 s_arg0: PTR_WD          0x0
162 s_arg1: PTR_WD          0x0                       162 s_arg1: PTR_WD          0x0
163 s_arg2: PTR_WD          0x0                       163 s_arg2: PTR_WD          0x0
164 s_arg3: PTR_WD          0x0                       164 s_arg3: PTR_WD          0x0
165         .size   secondary_kexec_args,PTRSIZE*4    165         .size   secondary_kexec_args,PTRSIZE*4
166 kexec_flag:                                       166 kexec_flag:
167         LONG            0x1                       167         LONG            0x1
168                                                   168 
169 #endif                                            169 #endif
170                                                   170 
171 EXPORT(kexec_start_address)                       171 EXPORT(kexec_start_address)
172         PTR_WD          0x0                       172         PTR_WD          0x0
173         .size           kexec_start_address, P    173         .size           kexec_start_address, PTRSIZE
174                                                   174 
175 EXPORT(kexec_indirection_page)                    175 EXPORT(kexec_indirection_page)
176         PTR_WD          0                         176         PTR_WD          0
177         .size           kexec_indirection_page    177         .size           kexec_indirection_page, PTRSIZE
178                                                   178 
179 relocate_new_kernel_end:                          179 relocate_new_kernel_end:
180                                                   180 
181 EXPORT(relocate_new_kernel_size)                  181 EXPORT(relocate_new_kernel_size)
182         PTR_WD          relocate_new_kernel_en    182         PTR_WD          relocate_new_kernel_end - relocate_new_kernel
183         .size           relocate_new_kernel_si    183         .size           relocate_new_kernel_size, PTRSIZE
                                                      

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php