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

TOMOYO Linux Cross Reference
Linux/arch/s390/kernel/early.c

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/s390/kernel/early.c (Architecture ppc) and /arch/sparc64/kernel/early.c (Architecture sparc64)


  1 // SPDX-License-Identifier: GPL-2.0                 1 
  2 /*                                                
  3  *    Copyright IBM Corp. 2007, 2009              
  4  *    Author(s): Hongjie Yang <hongjie@us.ibm.    
  5  */                                               
  6                                                   
  7 #define KMSG_COMPONENT "setup"                    
  8 #define pr_fmt(fmt) KMSG_COMPONENT ": " fmt       
  9                                                   
 10 #include <linux/sched/debug.h>                    
 11 #include <linux/compiler.h>                       
 12 #include <linux/init.h>                           
 13 #include <linux/errno.h>                          
 14 #include <linux/string.h>                         
 15 #include <linux/ctype.h>                          
 16 #include <linux/lockdep.h>                        
 17 #include <linux/extable.h>                        
 18 #include <linux/pfn.h>                            
 19 #include <linux/uaccess.h>                        
 20 #include <linux/kernel.h>                         
 21 #include <asm/asm-extable.h>                      
 22 #include <linux/memblock.h>                       
 23 #include <asm/access-regs.h>                      
 24 #include <asm/diag.h>                             
 25 #include <asm/ebcdic.h>                           
 26 #include <asm/fpu.h>                              
 27 #include <asm/ipl.h>                              
 28 #include <asm/lowcore.h>                          
 29 #include <asm/processor.h>                        
 30 #include <asm/sections.h>                         
 31 #include <asm/setup.h>                            
 32 #include <asm/sysinfo.h>                          
 33 #include <asm/cpcmd.h>                            
 34 #include <asm/sclp.h>                             
 35 #include <asm/facility.h>                         
 36 #include <asm/boot_data.h>                        
 37 #include "entry.h"                                
 38                                                   
 39 #define decompressor_handled_param(param)         
 40 static int __init ignore_decompressor_param_##    
 41 {                                                 
 42         return 0;                                 
 43 }                                                 
 44 early_param(#param, ignore_decompressor_param_    
 45                                                   
 46 decompressor_handled_param(mem);                  
 47 decompressor_handled_param(vmalloc);              
 48 decompressor_handled_param(dfltcc);               
 49 decompressor_handled_param(facilities);           
 50 decompressor_handled_param(nokaslr);              
 51 decompressor_handled_param(cmma);                 
 52 decompressor_handled_param(relocate_lowcore);     
 53 #if IS_ENABLED(CONFIG_KVM)                        
 54 decompressor_handled_param(prot_virt);            
 55 #endif                                            
 56                                                   
 57 static void __init kasan_early_init(void)         
 58 {                                                 
 59 #ifdef CONFIG_KASAN                               
 60         init_task.kasan_depth = 0;                
 61         sclp_early_printk("KernelAddressSaniti    
 62 #endif                                            
 63 }                                                 
 64                                                   
 65 static void __init reset_tod_clock(void)          
 66 {                                                 
 67         union tod_clock clk;                      
 68                                                   
 69         if (store_tod_clock_ext_cc(&clk) == 0)    
 70                 return;                           
 71         /* TOD clock not running. Set the cloc    
 72         if (set_tod_clock(TOD_UNIX_EPOCH) || s    
 73                 disabled_wait();                  
 74                                                   
 75         memset(&tod_clock_base, 0, sizeof(tod_    
 76         tod_clock_base.tod = TOD_UNIX_EPOCH;      
 77         get_lowcore()->last_update_clock = TOD    
 78 }                                                 
 79                                                   
 80 /*                                                
 81  * Initialize storage key for kernel pages        
 82  */                                               
 83 static noinline __init void init_kernel_storag    
 84 {                                                 
 85 #if PAGE_DEFAULT_KEY                              
 86         unsigned long end_pfn, init_pfn;          
 87                                                   
 88         end_pfn = PFN_UP(__pa(_end));             
 89                                                   
 90         for (init_pfn = 0 ; init_pfn < end_pfn    
 91                 page_set_storage_key(init_pfn     
 92                                      PAGE_DEFA    
 93 #endif                                            
 94 }                                                 
 95                                                   
 96 static __initdata char sysinfo_page[PAGE_SIZE]    
 97                                                   
 98 static noinline __init void detect_machine_typ    
 99 {                                                 
100         struct sysinfo_3_2_2 *vmms = (struct s    
101                                                   
102         /* Check current-configuration-level *    
103         if (stsi(NULL, 0, 0, 0) <= 2) {           
104                 get_lowcore()->machine_flags |    
105                 return;                           
106         }                                         
107         /* Get virtual-machine cpu information    
108         if (stsi(vmms, 3, 2, 2) || !vmms->coun    
109                 return;                           
110                                                   
111         /* Detect known hypervisors */            
112         if (!memcmp(vmms->vm[0].cpi, "\xd2\xe5    
113                 get_lowcore()->machine_flags |    
114         else if (!memcmp(vmms->vm[0].cpi, "\xa    
115                 get_lowcore()->machine_flags |    
116 }                                                 
117                                                   
118 /* Remove leading, trailing and double whitesp    
119 static inline void strim_all(char *str)           
120 {                                                 
121         char *s;                                  
122                                                   
123         s = strim(str);                           
124         if (s != str)                             
125                 memmove(str, s, strlen(s));       
126         while (*str) {                            
127                 if (!isspace(*str++))             
128                         continue;                 
129                 if (isspace(*str)) {              
130                         s = skip_spaces(str);     
131                         memmove(str, s, strlen    
132                 }                                 
133         }                                         
134 }                                                 
135                                                   
136 static noinline __init void setup_arch_string(    
137 {                                                 
138         struct sysinfo_1_1_1 *mach = (struct s    
139         struct sysinfo_3_2_2 *vm = (struct sys    
140         char mstr[80], hvstr[17];                 
141                                                   
142         if (stsi(mach, 1, 1, 1))                  
143                 return;                           
144         EBCASC(mach->manufacturer, sizeof(mach    
145         EBCASC(mach->type, sizeof(mach->type))    
146         EBCASC(mach->model, sizeof(mach->model    
147         EBCASC(mach->model_capacity, sizeof(ma    
148         sprintf(mstr, "%-16.16s %-4.4s %-16.16    
149                 mach->manufacturer, mach->type    
150                 mach->model, mach->model_capac    
151         strim_all(mstr);                          
152         if (stsi(vm, 3, 2, 2) == 0 && vm->coun    
153                 EBCASC(vm->vm[0].cpi, sizeof(v    
154                 sprintf(hvstr, "%-16.16s", vm-    
155                 strim_all(hvstr);                 
156         } else {                                  
157                 sprintf(hvstr, "%s",              
158                         MACHINE_IS_LPAR ? "LPA    
159                         MACHINE_IS_VM ? "z/VM"    
160                         MACHINE_IS_KVM ? "KVM"    
161         }                                         
162         dump_stack_set_arch_desc("%s (%s)", ms    
163 }                                                 
164                                                   
165 static __init void setup_topology(void)           
166 {                                                 
167         int max_mnest;                            
168                                                   
169         if (!test_facility(11))                   
170                 return;                           
171         get_lowcore()->machine_flags |= MACHIN    
172         for (max_mnest = 6; max_mnest > 1; max    
173                 if (stsi(&sysinfo_page, 15, 1,    
174                         break;                    
175         }                                         
176         topology_max_mnest = max_mnest;           
177 }                                                 
178                                                   
179 void __init __do_early_pgm_check(struct pt_reg    
180 {                                                 
181         struct lowcore *lc = get_lowcore();       
182         unsigned long ip;                         
183                                                   
184         regs->int_code = lc->pgm_int_code;        
185         regs->int_parm_long = lc->trans_exc_co    
186         ip = __rewind_psw(regs->psw, regs->int    
187                                                   
188         /* Monitor Event? Might be a warning *    
189         if ((regs->int_code & PGM_INT_CODE_MAS    
190                 if (report_bug(ip, regs) == BU    
191                         return;                   
192         }                                         
193         if (fixup_exception(regs))                
194                 return;                           
195         /*                                        
196          * Unhandled exception - system cannot    
197          * helpful messages to the console. Us    
198          * some basic information in case it i    
199          */                                       
200         register_early_console();                 
201         early_printk("PANIC: early exception %    
202                      regs->int_code & 0xffff,     
203         show_regs(regs);                          
204         disabled_wait();                          
205 }                                                 
206                                                   
207 static noinline __init void setup_lowcore_earl    
208 {                                                 
209         struct lowcore *lc = get_lowcore();       
210         psw_t psw;                                
211                                                   
212         psw.addr = (unsigned long)early_pgm_ch    
213         psw.mask = PSW_KERNEL_BITS;               
214         lc->program_new_psw = psw;                
215         lc->preempt_count = INIT_PREEMPT_COUNT    
216         lc->return_lpswe = gen_lpswe(__LC_RETU    
217         lc->return_mcck_lpswe = gen_lpswe(__LC    
218 }                                                 
219                                                   
220 static __init void detect_diag9c(void)            
221 {                                                 
222         unsigned int cpu_address;                 
223         int rc;                                   
224                                                   
225         cpu_address = stap();                     
226         diag_stat_inc(DIAG_STAT_X09C);            
227         asm volatile(                             
228                 "       diag    %2,0,0x9c\n"      
229                 "0:     la      %0,0\n"           
230                 "1:\n"                            
231                 EX_TABLE(0b,1b)                   
232                 : "=d" (rc) : "" (-EOPNOTSUPP)    
233         if (!rc)                                  
234                 get_lowcore()->machine_flags |    
235 }                                                 
236                                                   
237 static __init void detect_machine_facilities(v    
238 {                                                 
239         if (test_facility(8)) {                   
240                 get_lowcore()->machine_flags |    
241                 system_ctl_set_bit(0, CR0_EDAT    
242         }                                         
243         if (test_facility(78))                    
244                 get_lowcore()->machine_flags |    
245         if (test_facility(3))                     
246                 get_lowcore()->machine_flags |    
247         if (test_facility(50) && test_facility    
248                 get_lowcore()->machine_flags |    
249                 system_ctl_set_bit(0, CR0_TRAN    
250         }                                         
251         if (test_facility(51))                    
252                 get_lowcore()->machine_flags |    
253         if (test_facility(129))                   
254                 system_ctl_set_bit(0, CR0_VECT    
255         if (test_facility(130))                   
256                 get_lowcore()->machine_flags |    
257         if (test_facility(133))                   
258                 get_lowcore()->machine_flags |    
259         if (test_facility(139) && (tod_clock_b    
260                 /* Enabled signed clock compar    
261                 get_lowcore()->machine_flags |    
262                 clock_comparator_max = -1ULL >    
263                 system_ctl_set_bit(0, CR0_CLOC    
264         }                                         
265         if (IS_ENABLED(CONFIG_PCI) && test_fac    
266                 get_lowcore()->machine_flags |    
267                 /* the control bit is set duri    
268         }                                         
269         if (test_facility(194))                   
270                 get_lowcore()->machine_flags |    
271         if (test_facility(85))                    
272                 get_lowcore()->machine_flags |    
273 }                                                 
274                                                   
275 static inline void save_vector_registers(void)    
276 {                                                 
277 #ifdef CONFIG_CRASH_DUMP                          
278         if (test_facility(129))                   
279                 save_vx_regs(boot_cpu_vector_s    
280 #endif                                            
281 }                                                 
282                                                   
283 static inline void setup_low_address_protectio    
284 {                                                 
285         system_ctl_set_bit(0, CR0_LOW_ADDRESS_    
286 }                                                 
287                                                   
288 static inline void setup_access_registers(void    
289 {                                                 
290         unsigned int acrs[NUM_ACRS] = { 0 };      
291                                                   
292         restore_access_regs(acrs);                
293 }                                                 
294                                                   
295 char __bootdata(early_command_line)[COMMAND_LI    
296 static void __init setup_boot_command_line(voi    
297 {                                                 
298         /* copy arch command line */              
299         strscpy(boot_command_line, early_comma    
300 }                                                 
301                                                   
302 static void __init sort_amode31_extable(void)     
303 {                                                 
304         sort_extable(__start_amode31_ex_table,    
305 }                                                 
306                                                   
307 void __init startup_init(void)                    
308 {                                                 
309         kasan_early_init();                       
310         reset_tod_clock();                        
311         time_early_init();                        
312         init_kernel_storage_key();                
313         lockdep_off();                            
314         sort_amode31_extable();                   
315         setup_lowcore_early();                    
316         detect_machine_type();                    
317         setup_arch_string();                      
318         setup_boot_command_line();                
319         detect_diag9c();                          
320         detect_machine_facilities();              
321         save_vector_registers();                  
322         setup_topology();                         
323         sclp_early_detect();                      
324         setup_low_address_protection();           
325         setup_access_registers();                 
326         lockdep_on();                             
327 }                                                 
328                                                   

~ [ 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