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

TOMOYO Linux Cross Reference
Linux/Documentation/arch/x86/boot.rst

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 /Documentation/arch/x86/boot.rst (Version linux-6.12-rc7) and /Documentation/arch/m68k/boot.rst (Version linux-4.9.337)


  1 .. SPDX-License-Identifier: GPL-2.0               
  2                                                   
  3 ===========================                       
  4 The Linux/x86 Boot Protocol                       
  5 ===========================                       
  6                                                   
  7 On the x86 platform, the Linux kernel uses a r    
  8 convention.  This has evolved partially due to    
  9 well as the desire in the early days to have t    
 10 bootable image, the complicated PC memory mode    
 11 expectations in the PC industry caused by the     
 12 real-mode DOS as a mainstream operating system    
 13                                                   
 14 Currently, the following versions of the Linux    
 15                                                   
 16 =============   ==============================    
 17 Old kernels     zImage/Image support only.  So    
 18                 may not even support a command    
 19                                                   
 20 Protocol 2.00   (Kernel 1.3.73) Added bzImage     
 21                 well as a formalized way to co    
 22                 boot loader and the kernel.  s    
 23                 although the traditional setup    
 24                 writable.                         
 25                                                   
 26 Protocol 2.01   (Kernel 1.3.76) Added a heap o    
 27                                                   
 28 Protocol 2.02   (Kernel 2.4.0-test3-pre3) New     
 29                 Lower the conventional memory     
 30                 of the traditional setup area,    
 31                 safe for systems which use the    
 32                 BIOS entry points.  zImage dep    
 33                 supported.                        
 34                                                   
 35 Protocol 2.03   (Kernel 2.4.18-pre1) Explicitl    
 36                 initrd address available to th    
 37                                                   
 38 Protocol 2.04   (Kernel 2.6.14) Extend the sys    
 39                                                   
 40 Protocol 2.05   (Kernel 2.6.20) Make protected    
 41                 Introduce relocatable_kernel a    
 42                                                   
 43 Protocol 2.06   (Kernel 2.6.22) Added a field     
 44                 the boot command line.            
 45                                                   
 46 Protocol 2.07   (Kernel 2.6.24) Added paravirt    
 47                 Introduced hardware_subarch an    
 48                 and KEEP_SEGMENTS flag in load    
 49                                                   
 50 Protocol 2.08   (Kernel 2.6.26) Added crc32 ch    
 51                 payload. Introduced payload_of    
 52                 fields to aid in locating the     
 53                                                   
 54 Protocol 2.09   (Kernel 2.6.26) Added a field     
 55                 pointer to single linked list     
 56                                                   
 57 Protocol 2.10   (Kernel 2.6.31) Added a protoc    
 58                 beyond the kernel_alignment ad    
 59                 pref_address fields.  Added ex    
 60                                                   
 61 Protocol 2.11   (Kernel 3.6) Added a field for    
 62                 protocol entry point.             
 63                                                   
 64 Protocol 2.12   (Kernel 3.8) Added the xloadfl    
 65                 to struct boot_params for load    
 66                 above 4G in 64bit.                
 67                                                   
 68 Protocol 2.13   (Kernel 3.14) Support 32- and     
 69                 xloadflags to support booting     
 70                 EFI                               
 71                                                   
 72 Protocol 2.14   BURNT BY INCORRECT COMMIT         
 73                 ae7e1238e68f2a472a125673ab506d    
 74                 ("x86/boot: Add ACPI RSDP addr    
 75                 DO NOT USE!!! ASSUME SAME AS 2    
 76                                                   
 77 Protocol 2.15   (Kernel 5.5) Added the kernel_    
 78 =============   ==============================    
 79                                                   
 80   .. note::                                       
 81      The protocol version number should be cha    
 82      is changed. There is no need to update th    
 83      or kernel_info are changed. Additionally,    
 84      xloadflags (in this case the protocol ver    
 85      updated either) or kernel_info to communi    
 86      features to the boot loader. Due to very     
 87      the original setup header every update to    
 88      with great care. Starting from the protoc    
 89      communicate things to the boot loader is     
 90                                                   
 91                                                   
 92 Memory Layout                                     
 93 =============                                     
 94                                                   
 95 The traditional memory map for the kernel load    
 96 zImage kernels, typically looks like::            
 97                                                   
 98                 |                        |        
 99         0A0000  +------------------------+        
100                 |  Reserved for BIOS     |        
101         09A000  +------------------------+        
102                 |  Command line          |        
103                 |  Stack/heap            |        
104         098000  +------------------------+        
105                 |  Kernel setup          |        
106         090200  +------------------------+        
107                 |  Kernel boot sector    |        
108         090000  +------------------------+        
109                 |  Protected-mode kernel |        
110         010000  +------------------------+        
111                 |  Boot loader           |        
112         001000  +------------------------+        
113                 |  Reserved for MBR/BIOS |        
114         000800  +------------------------+        
115                 |  Typically used by MBR |        
116         000600  +------------------------+        
117                 |  BIOS use only         |        
118         000000  +------------------------+        
119                                                   
120 When using bzImage, the protected-mode kernel     
121 0x100000 ("high memory"), and the kernel real-    
122 setup, and stack/heap) was made relocatable to    
123 0x10000 and end of low memory. Unfortunately,     
124 2.01 the 0x90000+ memory range is still used i    
125 the 2.02 protocol resolves that problem.          
126                                                   
127 It is desirable to keep the "memory ceiling" -    
128 low memory touched by the boot loader -- as lo    
129 some newer BIOSes have begun to allocate some     
130 memory, called the Extended BIOS Data Area, ne    
131 memory.  The boot loader should use the "INT 1    
132 how much low memory is available.                 
133                                                   
134 Unfortunately, if INT 12h reports that the amo    
135 low, there is usually nothing the boot loader     
136 error to the user.  The boot loader should the    
137 take up as little space in low memory as it re    
138 zImage or old bzImage kernels, which need data    
139 0x90000 segment, the boot loader should make s    
140 above the 0x9A000 point; too many BIOSes will     
141                                                   
142 For a modern bzImage kernel with boot protocol    
143 memory layout like the following is suggested:    
144                                                   
145                 ~                        ~        
146                 |  Protected-mode kernel |        
147         100000  +------------------------+        
148                 |  I/O memory hole       |        
149         0A0000  +------------------------+        
150                 |  Reserved for BIOS     |        
151                 ~                        ~        
152                 |  Command line          |        
153         X+10000 +------------------------+        
154                 |  Stack/heap            |        
155         X+08000 +------------------------+        
156                 |  Kernel setup          |        
157                 |  Kernel boot sector    |        
158         X       +------------------------+        
159                 |  Boot loader           |        
160         001000  +------------------------+        
161                 |  Reserved for MBR/BIOS |        
162         000800  +------------------------+        
163                 |  Typically used by MBR |        
164         000600  +------------------------+        
165                 |  BIOS use only         |        
166         000000  +------------------------+        
167                                                   
168   ... where the address X is as low as the des    
169                                                   
170                                                   
171 The Real-Mode Kernel Header                       
172 ===========================                       
173                                                   
174 In the following text, and anywhere in the ker    
175 sector" refers to 512 bytes.  It is independen    
176 size of the underlying medium.                    
177                                                   
178 The first step in loading a Linux kernel shoul    
179 real-mode code (boot sector and setup code) an    
180 following header at offset 0x01f1.  The real-m    
181 32K, although the boot loader may choose to lo    
182 sectors (1K) and then examine the bootup secto    
183                                                   
184 The header looks like:                            
185                                                   
186 ===========     ========        ==============    
187 Offset/Size     Proto           Name              
188 ===========     ========        ==============    
189 01F1/1          ALL(1)          setup_sects       
190 01F2/2          ALL             root_flags        
191 01F4/4          2.04+(2)        syssize           
192 01F8/2          ALL             ram_size          
193 01FA/2          ALL             vid_mode          
194 01FC/2          ALL             root_dev          
195 01FE/2          ALL             boot_flag         
196 0200/2          2.00+           jump              
197 0202/4          2.00+           header            
198 0206/2          2.00+           version           
199 0208/4          2.00+           realmode_swtch    
200 020C/2          2.00+           start_sys_seg     
201 020E/2          2.00+           kernel_version    
202 0210/1          2.00+           type_of_loader    
203 0211/1          2.00+           loadflags         
204 0212/2          2.00+           setup_move_siz    
205 0214/4          2.00+           code32_start      
206 0218/4          2.00+           ramdisk_image     
207 021C/4          2.00+           ramdisk_size      
208 0220/4          2.00+           bootsect_kludg    
209 0224/2          2.01+           heap_end_ptr      
210 0226/1          2.02+(3)        ext_loader_ver    
211 0227/1          2.02+(3)        ext_loader_typ    
212 0228/4          2.02+           cmd_line_ptr      
213 022C/4          2.03+           initrd_addr_ma    
214 0230/4          2.05+           kernel_alignme    
215 0234/1          2.05+           relocatable_ke    
216 0235/1          2.10+           min_alignment     
217 0236/2          2.12+           xloadflags        
218 0238/4          2.06+           cmdline_size      
219 023C/4          2.07+           hardware_subar    
220 0240/8          2.07+           hardware_subar    
221 0248/4          2.08+           payload_offset    
222 024C/4          2.08+           payload_length    
223 0250/8          2.09+           setup_data        
224                                                   
225 0258/8          2.10+           pref_address      
226 0260/4          2.10+           init_size         
227 0264/4          2.11+           handover_offse    
228 0268/4          2.15+           kernel_info_of    
229 ===========     ========        ==============    
230                                                   
231 .. note::                                         
232   (1) For backwards compatibility, if the setu    
233       real value is 4.                            
234                                                   
235   (2) For boot protocol prior to 2.04, the upp    
236       field are unusable, which means the size    
237       cannot be determined.                       
238                                                   
239   (3) Ignored, but safe to set, for boot proto    
240                                                   
241 If the "HdrS" (0x53726448) magic number is not    
242 the boot protocol version is "old".  Loading a    
243 following parameters should be assumed::          
244                                                   
245         Image type = zImage                       
246         initrd not supported                      
247         Real-mode kernel must be located at 0x    
248                                                   
249 Otherwise, the "version" field contains the pr    
250 e.g. protocol version 2.01 will contain 0x0201    
251 setting fields in the header, you must make su    
252 supported by the protocol version in use.         
253                                                   
254                                                   
255 Details of Header Fields                          
256 ========================                          
257                                                   
258 For each field, some are information from the     
259 ("read"), some are expected to be filled out b    
260 ("write"), and some are expected to be read an    
261 bootloader ("modify").                            
262                                                   
263 All general purpose boot loaders should write     
264 (obligatory).  Boot loaders who want to load t    
265 nonstandard address should fill in the fields     
266 boot loaders can ignore those fields.             
267                                                   
268 The byte order of all fields is littleendian (    
269                                                   
270 ============    ===========                       
271 Field name:     setup_sects                       
272 Type:           read                              
273 Offset/size:    0x1f1/1                           
274 Protocol:       ALL                               
275 ============    ===========                       
276                                                   
277   The size of the setup code in 512-byte secto    
278   0, the real value is 4.  The real-mode code     
279   sector (always one 512-byte sector) plus the    
280                                                   
281 ============    =================                 
282 Field name:     root_flags                        
283 Type:           modify (optional)                 
284 Offset/size:    0x1f2/2                           
285 Protocol:       ALL                               
286 ============    =================                 
287                                                   
288   If this field is nonzero, the root defaults     
289   this field is deprecated; use the "ro" or "r    
290   command line instead.                           
291                                                   
292 ============    ==============================    
293 Field name:     syssize                           
294 Type:           read                              
295 Offset/size:    0x1f4/4 (protocol 2.04+) 0x1f4    
296 Protocol:       2.04+                             
297 ============    ==============================    
298                                                   
299   The size of the protected-mode code in units    
300   For protocol versions older than 2.04 this f    
301   wide, and therefore cannot be trusted for th    
302   the LOAD_HIGH flag is set.                      
303                                                   
304 ============    ===============                   
305 Field name:     ram_size                          
306 Type:           kernel internal                   
307 Offset/size:    0x1f8/2                           
308 Protocol:       ALL                               
309 ============    ===============                   
310                                                   
311   This field is obsolete.                         
312                                                   
313 ============    ===================               
314 Field name:     vid_mode                          
315 Type:           modify (obligatory)               
316 Offset/size:    0x1fa/2                           
317 ============    ===================               
318                                                   
319   Please see the section on SPECIAL COMMAND LI    
320                                                   
321 ============    =================                 
322 Field name:     root_dev                          
323 Type:           modify (optional)                 
324 Offset/size:    0x1fc/2                           
325 Protocol:       ALL                               
326 ============    =================                 
327                                                   
328   The default root device device number.  The     
329   deprecated, use the "root=" option on the co    
330                                                   
331 ============    =========                         
332 Field name:     boot_flag                         
333 Type:           read                              
334 Offset/size:    0x1fe/2                           
335 Protocol:       ALL                               
336 ============    =========                         
337                                                   
338   Contains 0xAA55.  This is the closest thing     
339   to a magic number.                              
340                                                   
341 ============    =======                           
342 Field name:     jump                              
343 Type:           read                              
344 Offset/size:    0x200/2                           
345 Protocol:       2.00+                             
346 ============    =======                           
347                                                   
348   Contains an x86 jump instruction, 0xEB follo    
349   relative to byte 0x202.  This can be used to    
350   the header.                                     
351                                                   
352 ============    =======                           
353 Field name:     header                            
354 Type:           read                              
355 Offset/size:    0x202/4                           
356 Protocol:       2.00+                             
357 ============    =======                           
358                                                   
359   Contains the magic number "HdrS" (0x53726448    
360                                                   
361 ============    =======                           
362 Field name:     version                           
363 Type:           read                              
364 Offset/size:    0x206/2                           
365 Protocol:       2.00+                             
366 ============    =======                           
367                                                   
368   Contains the boot protocol version, in (majo    
369   e.g. 0x0204 for version 2.04, and 0x0a11 for    
370   10.17.                                          
371                                                   
372 ============    =================                 
373 Field name:     realmode_swtch                    
374 Type:           modify (optional)                 
375 Offset/size:    0x208/4                           
376 Protocol:       2.00+                             
377 ============    =================                 
378                                                   
379   Boot loader hook (see ADVANCED BOOT LOADER H    
380                                                   
381 ============    =============                     
382 Field name:     start_sys_seg                     
383 Type:           read                              
384 Offset/size:    0x20c/2                           
385 Protocol:       2.00+                             
386 ============    =============                     
387                                                   
388   The load low segment (0x1000).  Obsolete.       
389                                                   
390 ============    ==============                    
391 Field name:     kernel_version                    
392 Type:           read                              
393 Offset/size:    0x20e/2                           
394 Protocol:       2.00+                             
395 ============    ==============                    
396                                                   
397   If set to a nonzero value, contains a pointe    
398   human-readable kernel version number string,    
399   be used to display the kernel version to the    
400   should be less than (0x200*setup_sects).        
401                                                   
402   For example, if this value is set to 0x1c00,    
403   number string can be found at offset 0x1e00     
404   This is a valid value if and only if the "se    
405   contains the value 15 or higher, as::           
406                                                   
407         0x1c00  < 15*0x200 (= 0x1e00) but         
408         0x1c00 >= 14*0x200 (= 0x1c00)             
409                                                   
410         0x1c00 >> 9 = 14, So the minimum value    
411                                                   
412 ============    ==================                
413 Field name:     type_of_loader                    
414 Type:           write (obligatory)                
415 Offset/size:    0x210/1                           
416 Protocol:       2.00+                             
417 ============    ==================                
418                                                   
419   If your boot loader has an assigned id (see     
420   0xTV here, where T is an identifier for the     
421   a version number.  Otherwise, enter 0xFF her    
422                                                   
423   For boot loader IDs above T = 0xD, write T =    
424   write the extended ID minus 0x10 to the ext_    
425   Similarly, the ext_loader_ver field can be u    
426   four bits for the bootloader version.           
427                                                   
428   For example, for T = 0x15, V = 0x234, write:    
429                                                   
430         type_of_loader  <- 0xE4                   
431         ext_loader_type <- 0x05                   
432         ext_loader_ver  <- 0x23                   
433                                                   
434   Assigned boot loader ids (hexadecimal):         
435                                                   
436         == ===================================    
437         0  LILO                                   
438            (0x00 reserved for pre-2.00 bootloa    
439         1  Loadlin                                
440         2  bootsect-loader                        
441            (0x20, all other values reserved)      
442         3  Syslinux                               
443         4  Etherboot/gPXE/iPXE                    
444         5  ELILO                                  
445         7  GRUB                                   
446         8  U-Boot                                 
447         9  Xen                                    
448         A  Gujin                                  
449         B  Qemu                                   
450         C  Arcturus Networks uCbootloader         
451         D  kexec-tools                            
452         E  Extended (see ext_loader_type)         
453         F  Special (0xFF = undefined)             
454         10 Reserved                               
455         11 Minimal Linux Bootloader               
456            <http://sebastian-plotz.blogspot.de    
457         12 OVMF UEFI virtualization stack         
458         13 barebox                                
459         == ===================================    
460                                                   
461   Please contact <hpa@zytor.com> if you need a     
462                                                   
463 ============    ===================               
464 Field name:     loadflags                         
465 Type:           modify (obligatory)               
466 Offset/size:    0x211/1                           
467 Protocol:       2.00+                             
468 ============    ===================               
469                                                   
470   This field is a bitmask.                        
471                                                   
472   Bit 0 (read): LOADED_HIGH                       
473                                                   
474         - If 0, the protected-mode code is loa    
475         - If 1, the protected-mode code is loa    
476                                                   
477   Bit 1 (kernel internal): KASLR_FLAG             
478                                                   
479         - Used internally by the compressed ke    
480           KASLR status to kernel proper.          
481                                                   
482             - If 1, KASLR enabled.                
483             - If 0, KASLR disabled.               
484                                                   
485   Bit 5 (write): QUIET_FLAG                       
486                                                   
487         - If 0, print early messages.             
488         - If 1, suppress early messages.          
489                                                   
490                 This requests to the kernel (d    
491                 kernel) to not write early mes    
492                 accessing the display hardware    
493                                                   
494   Bit 6 (obsolete): KEEP_SEGMENTS                 
495                                                   
496         Protocol: 2.07+                           
497                                                   
498         - This flag is obsolete.                  
499                                                   
500   Bit 7 (write): CAN_USE_HEAP                     
501                                                   
502         Set this bit to 1 to indicate that the    
503         heap_end_ptr is valid.  If this field     
504         functionality will be disabled.           
505                                                   
506                                                   
507 ============    ===================               
508 Field name:     setup_move_size                   
509 Type:           modify (obligatory)               
510 Offset/size:    0x212/2                           
511 Protocol:       2.00-2.01                         
512 ============    ===================               
513                                                   
514   When using protocol 2.00 or 2.01, if the rea    
515   loaded at 0x90000, it gets moved there later    
516   sequence.  Fill in this field if you want ad    
517   the kernel command line) moved in addition t    
518   itself.                                         
519                                                   
520   The unit is bytes starting with the beginnin    
521                                                   
522   This field is can be ignored when the protoc    
523   if the real-mode code is loaded at 0x90000.     
524                                                   
525 ============    ========================          
526 Field name:     code32_start                      
527 Type:           modify (optional, reloc)          
528 Offset/size:    0x214/4                           
529 Protocol:       2.00+                             
530 ============    ========================          
531                                                   
532   The address to jump to in protected mode.  T    
533   address of the kernel, and can be used by th    
534   determine the proper load address.              
535                                                   
536   This field can be modified for two purposes:    
537                                                   
538     1. as a boot loader hook (see Advanced Boo    
539                                                   
540     2. if a bootloader which does not install     
541        relocatable kernel at a nonstandard add    
542        this field to point to the load address    
543                                                   
544 ============    ==================                
545 Field name:     ramdisk_image                     
546 Type:           write (obligatory)                
547 Offset/size:    0x218/4                           
548 Protocol:       2.00+                             
549 ============    ==================                
550                                                   
551   The 32-bit linear address of the initial ram    
552   zero if there is no initial ramdisk/ramfs.      
553                                                   
554 ============    ==================                
555 Field name:     ramdisk_size                      
556 Type:           write (obligatory)                
557 Offset/size:    0x21c/4                           
558 Protocol:       2.00+                             
559 ============    ==================                
560                                                   
561   Size of the initial ramdisk or ramfs.  Leave    
562   initial ramdisk/ramfs.                          
563                                                   
564 ============    ===============                   
565 Field name:     bootsect_kludge                   
566 Type:           kernel internal                   
567 Offset/size:    0x220/4                           
568 Protocol:       2.00+                             
569 ============    ===============                   
570                                                   
571   This field is obsolete.                         
572                                                   
573 ============    ==================                
574 Field name:     heap_end_ptr                      
575 Type:           write (obligatory)                
576 Offset/size:    0x224/2                           
577 Protocol:       2.01+                             
578 ============    ==================                
579                                                   
580   Set this field to the offset (from the begin    
581   code) of the end of the setup stack/heap, mi    
582                                                   
583 ============    ================                  
584 Field name:     ext_loader_ver                    
585 Type:           write (optional)                  
586 Offset/size:    0x226/1                           
587 Protocol:       2.02+                             
588 ============    ================                  
589                                                   
590   This field is used as an extension of the ve    
591   type_of_loader field.  The total version num    
592   (type_of_loader & 0x0f) + (ext_loader_ver <<    
593                                                   
594   The use of this field is boot loader specifi    
595   is zero.                                        
596                                                   
597   Kernels prior to 2.6.31 did not recognize th    
598   to write for protocol version 2.02 or higher    
599                                                   
600 ============    ==============================    
601 Field name:     ext_loader_type                   
602 Type:           write (obligatory if (type_of_    
603 Offset/size:    0x227/1                           
604 Protocol:       2.02+                             
605 ============    ==============================    
606                                                   
607   This field is used as an extension of the ty    
608   type_of_loader field.  If the type in type_o    
609   the actual type is (ext_loader_type + 0x10).    
610                                                   
611   This field is ignored if the type in type_of    
612                                                   
613   Kernels prior to 2.6.31 did not recognize th    
614   to write for protocol version 2.02 or higher    
615                                                   
616 ============    ==================                
617 Field name:     cmd_line_ptr                      
618 Type:           write (obligatory)                
619 Offset/size:    0x228/4                           
620 Protocol:       2.02+                             
621 ============    ==================                
622                                                   
623   Set this field to the linear address of the     
624   The kernel command line can be located anywh    
625   the setup heap and 0xA0000; it does not have    
626   same 64K segment as the real-mode code itsel    
627                                                   
628   Fill in this field even if your boot loader     
629   command line, in which case you can point th    
630   (or better yet, to the string "auto".)  If t    
631   zero, the kernel will assume that your boot     
632   the 2.02+ protocol.                             
633                                                   
634 ============    ===============                   
635 Field name:     initrd_addr_max                   
636 Type:           read                              
637 Offset/size:    0x22c/4                           
638 Protocol:       2.03+                             
639 ============    ===============                   
640                                                   
641   The maximum address that may be occupied by     
642   ramdisk/ramfs contents.  For boot protocols     
643   field is not present, and the maximum addres    
644   address is defined as the address of the hig    
645   your ramdisk is exactly 131072 bytes long an    
646   0x37FFFFFF, you can start your ramdisk at 0x    
647                                                   
648 ============    ============================      
649 Field name:     kernel_alignment                  
650 Type:           read/modify (reloc)               
651 Offset/size:    0x230/4                           
652 Protocol:       2.05+ (read), 2.10+ (modify)      
653 ============    ============================      
654                                                   
655   Alignment unit required by the kernel (if re    
656   true.)  A relocatable kernel that is loaded     
657   incompatible with the value in this field wi    
658   kernel initialization.                          
659                                                   
660   Starting with protocol version 2.10, this re    
661   alignment preferred for optimal performance;    
662   loader to modify this field to permit a less    
663   min_alignment and pref_address field below.     
664                                                   
665 ============    ==================                
666 Field name:     relocatable_kernel                
667 Type:           read (reloc)                      
668 Offset/size:    0x234/1                           
669 Protocol:       2.05+                             
670 ============    ==================                
671                                                   
672   If this field is nonzero, the protected-mode    
673   be loaded at any address that satisfies the     
674   After loading, the boot loader must set the     
675   point to the loaded code, or to a boot loade    
676                                                   
677 ============    =============                     
678 Field name:     min_alignment                     
679 Type:           read (reloc)                      
680 Offset/size:    0x235/1                           
681 Protocol:       2.10+                             
682 ============    =============                     
683                                                   
684   This field, if nonzero, indicates as a power    
685   alignment required, as opposed to preferred,    
686   If a boot loader makes use of this field, it    
687   kernel_alignment field with the alignment un    
688                                                   
689         kernel_alignment = 1 << min_alignment     
690                                                   
691   There may be a considerable performance cost    
692   misaligned kernel.  Therefore, a loader shou    
693   power-of-two alignment from kernel_alignment    
694                                                   
695 ============    ==========                        
696 Field name:     xloadflags                        
697 Type:           read                              
698 Offset/size:    0x236/2                           
699 Protocol:       2.12+                             
700 ============    ==========                        
701                                                   
702   This field is a bitmask.                        
703                                                   
704   Bit 0 (read): XLF_KERNEL_64                     
705                                                   
706         - If 1, this kernel has the legacy 64-    
707                                                   
708   Bit 1 (read): XLF_CAN_BE_LOADED_ABOVE_4G        
709                                                   
710         - If 1, kernel/boot_params/cmdline/ram    
711                                                   
712   Bit 2 (read): XLF_EFI_HANDOVER_32               
713                                                   
714         - If 1, the kernel supports the 32-bit    
715           given at handover_offset.               
716                                                   
717   Bit 3 (read): XLF_EFI_HANDOVER_64               
718                                                   
719         - If 1, the kernel supports the 64-bit    
720           given at handover_offset + 0x200.       
721                                                   
722   Bit 4 (read): XLF_EFI_KEXEC                     
723                                                   
724         - If 1, the kernel supports kexec EFI     
725                                                   
726                                                   
727 ============    ============                      
728 Field name:     cmdline_size                      
729 Type:           read                              
730 Offset/size:    0x238/4                           
731 Protocol:       2.06+                             
732 ============    ============                      
733                                                   
734   The maximum size of the command line without    
735   zero. This means that the command line can c    
736   cmdline_size characters. With protocol versi    
737   maximum size was 255.                           
738                                                   
739 ============    ==============================    
740 Field name:     hardware_subarch                  
741 Type:           write (optional, defaults to x    
742 Offset/size:    0x23c/4                           
743 Protocol:       2.07+                             
744 ============    ==============================    
745                                                   
746   In a paravirtualized environment the hardwar    
747   pieces such as interrupt handling, page tabl    
748   accessing process control registers needs to    
749                                                   
750   This field allows the bootloader to inform t    
751   one of those environments.                      
752                                                   
753   ==========    ==============================    
754   0x00000000    The default x86/PC environment    
755   0x00000001    lguest                            
756   0x00000002    Xen                               
757   0x00000003    Moorestown MID                    
758   0x00000004    CE4100 TV Platform                
759   ==========    ==============================    
760                                                   
761 ============    =========================         
762 Field name:     hardware_subarch_data             
763 Type:           write (subarch-dependent)         
764 Offset/size:    0x240/8                           
765 Protocol:       2.07+                             
766 ============    =========================         
767                                                   
768   A pointer to data that is specific to hardwa    
769   This field is currently unused for the defau    
770   do not modify.                                  
771                                                   
772 ============    ==============                    
773 Field name:     payload_offset                    
774 Type:           read                              
775 Offset/size:    0x248/4                           
776 Protocol:       2.08+                             
777 ============    ==============                    
778                                                   
779   If non-zero then this field contains the off    
780   of the protected-mode code to the payload.      
781                                                   
782   The payload may be compressed. The format of    
783   uncompressed data should be determined using    
784   numbers.  The currently supported compressio    
785   (magic numbers 1F 8B or 1F 9E), bzip2 (magic    
786   (magic number 5D 00), XZ (magic number FD 37    
787   02 21) and ZSTD (magic number 28 B5). The un    
788   currently always ELF (magic number 7F 45 4C     
789                                                   
790 ============    ==============                    
791 Field name:     payload_length                    
792 Type:           read                              
793 Offset/size:    0x24c/4                           
794 Protocol:       2.08+                             
795 ============    ==============                    
796                                                   
797   The length of the payload.                      
798                                                   
799 ============    ===============                   
800 Field name:     setup_data                        
801 Type:           write (special)                   
802 Offset/size:    0x250/8                           
803 Protocol:       2.09+                             
804 ============    ===============                   
805                                                   
806   The 64-bit physical pointer to NULL terminat    
807   struct setup_data. This is used to define a     
808   parameters passing mechanism. The definition    
809   as follow::                                     
810                                                   
811         struct setup_data {                       
812                 u64 next;                         
813                 u32 type;                         
814                 u32 len;                          
815                 u8  data[0];                      
816         };                                        
817                                                   
818   Where, the next is a 64-bit physical pointer    
819   linked list, the next field of the last node    
820   to identify the contents of data; the len is    
821   field; the data holds the real payload.         
822                                                   
823   This list may be modified at a number of poi    
824   process.  Therefore, when modifying this lis    
825   sure to consider the case where the linked l    
826   entries.                                        
827                                                   
828   The setup_data is a bit awkward to use for e    
829   both because the setup_data header has to be    
830   and because it has a 32-bit length field. Ho    
831   intermediate stages of the boot process have    
832   chunks of memory are occupied by kernel data    
833                                                   
834   Thus setup_indirect struct and SETUP_INDIREC    
835   protocol 2.15::                                 
836                                                   
837     struct setup_indirect {                       
838       __u32 type;                                 
839       __u32 reserved;  /* Reserved, must be se    
840       __u64 len;                                  
841       __u64 addr;                                 
842     };                                            
843                                                   
844   The type member is a SETUP_INDIRECT | SETUP_    
845   SETUP_INDIRECT itself since making the setup    
846   could require a lot of stack space in someth    
847   and stack space can be limited in boot conte    
848                                                   
849   Let's give an example how to point to SETUP_    
850   In this case setup_data and setup_indirect w    
851                                                   
852     struct setup_data {                           
853       __u64 next = 0 or <addr_of_next_setup_da    
854       __u32 type = SETUP_INDIRECT;                
855       __u32 len = sizeof(setup_indirect);         
856       __u8 data[sizeof(setup_indirect)] = stru    
857         __u32 type = SETUP_INDIRECT | SETUP_E8    
858         __u32 reserved = 0;                       
859         __u64 len = <len_of_SETUP_E820_EXT_dat    
860         __u64 addr = <addr_of_SETUP_E820_EXT_d    
861       }                                           
862     }                                             
863                                                   
864 .. note::                                         
865      SETUP_INDIRECT | SETUP_NONE objects canno    
866      from SETUP_INDIRECT itself. So, this kind    
867      by the bootloaders.                          
868                                                   
869 ============    ============                      
870 Field name:     pref_address                      
871 Type:           read (reloc)                      
872 Offset/size:    0x258/8                           
873 Protocol:       2.10+                             
874 ============    ============                      
875                                                   
876   This field, if nonzero, represents a preferr    
877   kernel.  A relocating bootloader should atte    
878   address if possible.                            
879                                                   
880   A non-relocatable kernel will unconditionall    
881   at this address. A relocatable kernel will m    
882   loaded below this address.                      
883                                                   
884 ============    =======                           
885 Field name:     init_size                         
886 Type:           read                              
887 Offset/size:    0x260/4                           
888 ============    =======                           
889                                                   
890   This field indicates the amount of linear co    
891   at the kernel runtime start address that the    
892   is capable of examining its memory map.  Thi    
893   as the total amount of memory the kernel nee    
894   be used by a relocating boot loader to help     
895   address for the kernel.                         
896                                                   
897   The kernel runtime start address is determin    
898                                                   
899         if (relocatable_kernel)                   
900         runtime_start = align_up(load_address,    
901         else                                      
902         runtime_start = pref_address              
903                                                   
904 ============    ===============                   
905 Field name:     handover_offset                   
906 Type:           read                              
907 Offset/size:    0x264/4                           
908 ============    ===============                   
909                                                   
910   This field is the offset from the beginning     
911   the EFI handover protocol entry point. Boot     
912   handover protocol to boot the kernel should     
913                                                   
914   See EFI HANDOVER PROTOCOL below for more det    
915                                                   
916 ============    ==================                
917 Field name:     kernel_info_offset                
918 Type:           read                              
919 Offset/size:    0x268/4                           
920 Protocol:       2.15+                             
921 ============    ==================                
922                                                   
923   This field is the offset from the beginning     
924   kernel_info. The kernel_info structure is em    
925   in the uncompressed protected mode region.      
926                                                   
927                                                   
928 The kernel_info                                   
929 ===============                                   
930                                                   
931 The relationships between the headers are anal    
932 sections:                                         
933                                                   
934   setup_header = .data                            
935   boot_params/setup_data = .bss                   
936                                                   
937 What is missing from the above list? That's ri    
938                                                   
939   kernel_info = .rodata                           
940                                                   
941 We have been (ab)using .data for things that c    
942 a long time, for lack of alternatives and -- e    
943 Also, the BIOS stub is responsible for creatin    
944 available to a BIOS-based loader (setup_data i    
945                                                   
946 setup_header is permanently limited to 144 byt    
947 2-byte jump field, which doubles as a length f    
948 with the size of the "hole" in struct boot_par    
949 or the BIOS stub has to copy it into. It is cu    
950 leaves us with 25 very precious bytes. This is    
951 without revising the boot protocol entirely, b    
952                                                   
953 boot_params proper is limited to 4096 bytes, b    
954 by adding setup_data entries. It cannot be use    
955 the kernel image, because it is .bss and has n    
956                                                   
957 kernel_info solves this by providing an extens    
958 the kernel image. It is readonly, because the     
959 bootloader copying its contents anywhere, but     
960 necessary it can still contain data items that    
961 expected to copy into a setup_data chunk.         
962                                                   
963 All kernel_info data should be part of this st    
964 be put before kernel_info_var_len_data label.     
965 after kernel_info_var_len_data label. Each chu    
966 be prefixed with header/magic and its size, e.    
967                                                   
968   kernel_info:                                    
969           .ascii  "LToP"          /* Header, L    
970           .long   kernel_info_var_len_data - k    
971           .long   kernel_info_end - kernel_inf    
972           .long   0x01234567      /* Some fixe    
973   kernel_info_var_len_data:                       
974   example_struct:                 /* Some vari    
975           .ascii  "0123"          /* Header/Ma    
976           .long   example_struct_end - example    
977           .ascii  "Struct"                        
978           .long   0x89012345                      
979   example_struct_end:                             
980   example_strings:                /* Some vari    
981           .ascii  "ABCD"          /* Header/Ma    
982           .long   example_strings_end - exampl    
983           .asciz  "String_0"                      
984           .asciz  "String_1"                      
985   example_strings_end:                            
986   kernel_info_end:                                
987                                                   
988 This way the kernel_info is self-contained blo    
989                                                   
990 .. note::                                         
991      Each variable size data header/magic can     
992      without \0 at the end of the string, whic    
993      existing variable length data headers/mag    
994                                                   
995                                                   
996 Details of the kernel_info Fields                 
997 =================================                 
998                                                   
999 ============    ========                          
1000 Field name:     header                           
1001 Offset/size:    0x0000/4                         
1002 ============    ========                         
1003                                                  
1004   Contains the magic number "LToP" (0x506f544    
1005                                                  
1006 ============    ========                         
1007 Field name:     size                             
1008 Offset/size:    0x0004/4                         
1009 ============    ========                         
1010                                                  
1011   This field contains the size of the kernel_    
1012   It does not count kernel_info.kernel_info_v    
1013   used by the bootloaders to detect supported    
1014   and beginning of kernel_info.kernel_info_va    
1015                                                  
1016 ============    ========                         
1017 Field name:     size_total                       
1018 Offset/size:    0x0008/4                         
1019 ============    ========                         
1020                                                  
1021   This field contains the size of the kernel_    
1022   and kernel_info.kernel_info_var_len_data.      
1023                                                  
1024 ============    ==============                   
1025 Field name:     setup_type_max                   
1026 Offset/size:    0x000c/4                         
1027 ============    ==============                   
1028                                                  
1029   This field contains maximal allowed type fo    
1030                                                  
1031                                                  
1032 The Image Checksum                               
1033 ==================                               
1034                                                  
1035 From boot protocol version 2.08 onwards the C    
1036 the entire file using the characteristic poly    
1037 initial remainder of 0xffffffff.  The checksu    
1038 file; therefore the CRC of the file up to the    
1039 syssize field of the header is always 0.         
1040                                                  
1041                                                  
1042 The Kernel Command Line                          
1043 =======================                          
1044                                                  
1045 The kernel command line has become an importa    
1046 loader to communicate with the kernel.  Some     
1047 relevant to the boot loader itself, see "spec    
1048 below.                                           
1049                                                  
1050 The kernel command line is a null-terminated     
1051 length can be retrieved from the field cmdlin    
1052 version 2.06, the maximum was 255 characters.    
1053 long will be automatically truncated by the k    
1054                                                  
1055 If the boot protocol version is 2.02 or later    
1056 kernel command line is given by the header fi    
1057 above.)  This address can be anywhere between    
1058 heap and 0xA0000.                                
1059                                                  
1060 If the protocol version is *not* 2.02 or high    
1061 command line is entered using the following p    
1062                                                  
1063   - At offset 0x0020 (word), "cmd_line_magic"    
1064     number 0xA33F.                               
1065                                                  
1066   - At offset 0x0022 (word), "cmd_line_offset    
1067     of the kernel command line (relative to t    
1068     real-mode kernel).                           
1069                                                  
1070   - The kernel command line *must* be within     
1071     covered by setup_move_size, so you may ne    
1072     field.                                       
1073                                                  
1074                                                  
1075 Memory Layout of The Real-Mode Code              
1076 ===================================              
1077                                                  
1078 The real-mode code requires a stack/heap to b    
1079 memory allocated for the kernel command line.    
1080 in the real-mode accessible memory in bottom     
1081                                                  
1082 It should be noted that modern machines often    
1083 BIOS Data Area (EBDA).  As a result, it is ad    
1084 of the low megabyte as possible.                 
1085                                                  
1086 Unfortunately, under the following circumstan    
1087 segment has to be used:                          
1088                                                  
1089         - When loading a zImage kernel ((load    
1090         - When loading a 2.01 or earlier boot    
1091                                                  
1092 .. note::                                        
1093      For the 2.00 and 2.01 boot protocols, th    
1094      can be loaded at another address, but it    
1095      relocated to 0x90000.  For the "old" pro    
1096      real-mode code must be loaded at 0x90000    
1097                                                  
1098 When loading at 0x90000, avoid using memory a    
1099                                                  
1100 For boot protocol 2.02 or higher, the command    
1101 located in the same 64K segment as the real-m    
1102 thus permitted to give the stack/heap the ful    
1103 the command line above it.                       
1104                                                  
1105 The kernel command line should not be located    
1106 code, nor should it be located in high memory    
1107                                                  
1108                                                  
1109 Sample Boot Configuration                        
1110 =========================                        
1111                                                  
1112 As a sample configuration, assume the followi    
1113 mode segment.                                    
1114                                                  
1115     When loading below 0x90000, use the entir    
1116                                                  
1117         =============   ===================      
1118         0x0000-0x7fff   Real mode kernel         
1119         0x8000-0xdfff   Stack and heap           
1120         0xe000-0xffff   Kernel command line      
1121         =============   ===================      
1122                                                  
1123     When loading at 0x90000 OR the protocol v    
1124                                                  
1125         =============   ===================      
1126         0x0000-0x7fff   Real mode kernel         
1127         0x8000-0x97ff   Stack and heap           
1128         0x9800-0x9fff   Kernel command line      
1129         =============   ===================      
1130                                                  
1131 Such a boot loader should enter the following    
1132                                                  
1133         unsigned long base_ptr; /* base addre    
1134                                                  
1135         if ( setup_sects == 0 ) {                
1136                 setup_sects = 4;                 
1137         }                                        
1138                                                  
1139         if ( protocol >= 0x0200 ) {              
1140                 type_of_loader = <type code>;    
1141                 if ( loading_initrd ) {          
1142                         ramdisk_image = <init    
1143                         ramdisk_size = <initr    
1144                 }                                
1145                                                  
1146                 if ( protocol >= 0x0202 && lo    
1147                         heap_end = 0xe000;       
1148                 else                             
1149                         heap_end = 0x9800;       
1150                                                  
1151                 if ( protocol >= 0x0201 ) {      
1152                         heap_end_ptr = heap_e    
1153                         loadflags |= 0x80; /*    
1154                 }                                
1155                                                  
1156                 if ( protocol >= 0x0202 ) {      
1157                         cmd_line_ptr = base_p    
1158                         strcpy(cmd_line_ptr,     
1159                 } else {                         
1160                         cmd_line_magic  = 0xA    
1161                         cmd_line_offset = hea    
1162                         setup_move_size = hea    
1163                         strcpy(base_ptr+cmd_l    
1164                 }                                
1165         } else {                                 
1166                 /* Very old kernel */            
1167                                                  
1168                 heap_end = 0x9800;               
1169                                                  
1170                 cmd_line_magic  = 0xA33F;        
1171                 cmd_line_offset = heap_end;      
1172                                                  
1173                 /* A very old kernel MUST hav    
1174                    loaded at 0x90000 */          
1175                                                  
1176                 if ( base_ptr != 0x90000 ) {     
1177                         /* Copy the real-mode    
1178                         memcpy(0x90000, base_    
1179                         base_ptr = 0x90000;      
1180                 }                                
1181                                                  
1182                 strcpy(0x90000+cmd_line_offse    
1183                                                  
1184                 /* It is recommended to clear    
1185                 memset(0x90000 + (setup_sects    
1186                        (64-(setup_sects+1))*5    
1187         }                                        
1188                                                  
1189                                                  
1190 Loading The Rest of The Kernel                   
1191 ==============================                   
1192                                                  
1193 The 32-bit (non-real-mode) kernel starts at o    
1194 in the kernel file (again, if setup_sects ==     
1195 It should be loaded at address 0x10000 for Im    
1196 0x100000 for bzImage kernels.                    
1197                                                  
1198 The kernel is a bzImage kernel if the protoco    
1199 bit (LOAD_HIGH) in the loadflags field is set    
1200                                                  
1201         is_bzImage = (protocol >= 0x0200) &&     
1202         load_address = is_bzImage ? 0x100000     
1203                                                  
1204 Note that Image/zImage kernels can be up to 5    
1205 the entire 0x10000-0x90000 range of memory.      
1206 much a requirement for these kernels to load     
1207 0x90000.  bzImage kernels allow much more fle    
1208                                                  
1209 Special Command Line Options                     
1210 ============================                     
1211                                                  
1212 If the command line provided by the boot load    
1213 user, the user may expect the following comma    
1214 They should normally not be deleted from the     
1215 though not all of them are actually meaningfu    
1216 loader authors who need additional command li    
1217 loader itself should get them registered in      
1218 Documentation/admin-guide/kernel-parameters.r    
1219 conflict with actual kernel options now or in    
1220                                                  
1221   vga=<mode>                                     
1222         <mode> here is either an integer (in     
1223         decimal, octal, or hexadecimal) or on    
1224         "normal" (meaning 0xFFFF), "ext" (mea    
1225         (meaning 0xFFFD).  This value should     
1226         vid_mode field, as it is used by the     
1227         line is parsed.                          
1228                                                  
1229   mem=<size>                                     
1230         <size> is an integer in C notation op    
1231         (case insensitive) K, M, G, T, P or E    
1232         << 30, << 40, << 50 or << 60).  This     
1233         memory to the kernel. This affects th    
1234         an initrd, since an initrd should be     
1235         memory.  Note that this is an option     
1236         the bootloader!                          
1237                                                  
1238   initrd=<file>                                  
1239         An initrd should be loaded.  The mean    
1240         obviously bootloader-dependent, and s    
1241         (e.g. LILO) do not have such a comman    
1242                                                  
1243 In addition, some boot loaders add the follow    
1244 user-specified command line:                     
1245                                                  
1246   BOOT_IMAGE=<file>                              
1247         The boot image which was loaded.  Aga    
1248         is obviously bootloader-dependent.       
1249                                                  
1250   auto                                           
1251         The kernel was booted without explici    
1252                                                  
1253 If these options are added by the boot loader    
1254 recommended that they are located *first*, be    
1255 or configuration-specified command line.  Oth    
1256 gets confused by the "auto" option.              
1257                                                  
1258                                                  
1259 Running the Kernel                               
1260 ==================                               
1261                                                  
1262 The kernel is started by jumping to the kerne    
1263 located at *segment* offset 0x20 from the sta    
1264 kernel.  This means that if you loaded your r    
1265 0x90000, the kernel entry point is 9020:0000.    
1266                                                  
1267 At entry, ds = es = ss should point to the st    
1268 kernel code (0x9000 if the code is loaded at     
1269 set up properly, normally pointing to the top    
1270 interrupts should be disabled.  Furthermore,     
1271 the kernel, it is recommended that the boot l    
1272 es = ss.                                         
1273                                                  
1274 In our example from above, we would do::         
1275                                                  
1276         /* Note: in the case of the "old" ker    
1277            be == 0x90000 at this point; see t    
1278                                                  
1279         seg = base_ptr >> 4;                     
1280                                                  
1281         cli();  /* Enter with interrupts disa    
1282                                                  
1283         /* Set up the real-mode kernel stack     
1284         _SS = seg;                               
1285         _SP = heap_end;                          
1286                                                  
1287         _DS = _ES = _FS = _GS = seg;             
1288         jmp_far(seg+0x20, 0);   /* Run the ke    
1289                                                  
1290 If your boot sector accesses a floppy drive,     
1291 switch off the floppy motor before running th    
1292 kernel boot leaves interrupts off and thus th    
1293 switched off, especially if the loaded kernel    
1294 a demand-loaded module!                          
1295                                                  
1296                                                  
1297 Advanced Boot Loader Hooks                       
1298 ==========================                       
1299                                                  
1300 If the boot loader runs in a particularly hos    
1301 LOADLIN, which runs under DOS) it may be impo    
1302 standard memory location requirements.  Such     
1303 following hooks that, if set, are invoked by     
1304 appropriate time.  The use of these hooks sho    
1305 considered an absolutely last resort!            
1306                                                  
1307 IMPORTANT: All the hooks are required to pres    
1308 %edi across invocation.                          
1309                                                  
1310   realmode_swtch:                                
1311         A 16-bit real mode far subroutine inv    
1312         entering protected mode.  The default    
1313         your routine should probably do so, t    
1314                                                  
1315   code32_start:                                  
1316         A 32-bit flat-mode routine *jumped* t    
1317         transition to protected mode, but bef    
1318         uncompressed.  No segments, except CS    
1319         set up (current kernels do, but older    
1320         set them up to BOOT_DS (0x18) yoursel    
1321                                                  
1322         After completing your hook, you shoul    
1323         that was in this field before your bo    
1324         (relocated, if appropriate.)             
1325                                                  
1326                                                  
1327 32-bit Boot Protocol                             
1328 ====================                             
1329                                                  
1330 For machine with some new BIOS other than leg    
1331 LinuxBIOS, etc, and kexec, the 16-bit real mo    
1332 based on legacy BIOS can not be used, so a 32    
1333 to be defined.                                   
1334                                                  
1335 In 32-bit boot protocol, the first step in lo    
1336 should be to setup the boot parameters (struc    
1337 traditionally known as "zero page"). The memo    
1338 should be allocated and initialized to all ze    
1339 from offset 0x01f1 of kernel image on should     
1340 boot_params and examined. The end of setup he    
1341 follow::                                         
1342                                                  
1343         0x0202 + byte value at offset 0x0201     
1344                                                  
1345 In addition to read/modify/write the setup he    
1346 boot_params as that of 16-bit boot protocol,     
1347 also fill the additional fields of the struct    
1348 described in chapter Documentation/arch/x86/z    
1349                                                  
1350 After setting up the struct boot_params, the     
1351 32/64-bit kernel in the same way as that of 1    
1352                                                  
1353 In 32-bit boot protocol, the kernel is starte    
1354 32-bit kernel entry point, which is the start    
1355 32/64-bit kernel.                                
1356                                                  
1357 At entry, the CPU must be in 32-bit protected    
1358 disabled; a GDT must be loaded with the descr    
1359 __BOOT_CS(0x10) and __BOOT_DS(0x18); both des    
1360 segment; __BOOT_CS must have execute/read per    
1361 must have read/write permission; CS must be _    
1362 must be __BOOT_DS; interrupt must be disabled    
1363 address of the struct boot_params; %ebp, %edi    
1364                                                  
1365 64-bit Boot Protocol                             
1366 ====================                             
1367                                                  
1368 For machine with 64bit cpus and 64bit kernel,    
1369 and we need a 64-bit boot protocol.              
1370                                                  
1371 In 64-bit boot protocol, the first step in lo    
1372 should be to setup the boot parameters (struc    
1373 traditionally known as "zero page"). The memo    
1374 could be allocated anywhere (even above 4G) a    
1375 Then, the setup header at offset 0x01f1 of ke    
1376 loaded into struct boot_params and examined.     
1377 can be calculated as follows::                   
1378                                                  
1379         0x0202 + byte value at offset 0x0201     
1380                                                  
1381 In addition to read/modify/write the setup he    
1382 boot_params as that of 16-bit boot protocol,     
1383 also fill the additional fields of the struct    
1384 in chapter Documentation/arch/x86/zero-page.r    
1385                                                  
1386 After setting up the struct boot_params, the     
1387 64-bit kernel in the same way as that of 16-b    
1388 kernel could be loaded above 4G.                 
1389                                                  
1390 In 64-bit boot protocol, the kernel is starte    
1391 64-bit kernel entry point, which is the start    
1392 64-bit kernel plus 0x200.                        
1393                                                  
1394 At entry, the CPU must be in 64-bit mode with    
1395 The range with setup_header.init_size from st    
1396 kernel and zero page and command line buffer     
1397 a GDT must be loaded with the descriptors for    
1398 __BOOT_CS(0x10) and __BOOT_DS(0x18); both des    
1399 segment; __BOOT_CS must have execute/read per    
1400 must have read/write permission; CS must be _    
1401 must be __BOOT_DS; interrupt must be disabled    
1402 address of the struct boot_params.               
1403                                                  
1404 EFI Handover Protocol (deprecated)               
1405 ==================================               
1406                                                  
1407 This protocol allows boot loaders to defer in    
1408 boot stub. The boot loader is required to loa    
1409 from the boot media and jump to the EFI hando    
1410 which is hdr->handover_offset bytes from the     
1411 startup_{32,64}.                                 
1412                                                  
1413 The boot loader MUST respect the kernel's PE/    
1414 to section alignment, the memory footprint of    
1415 the size of the file itself, and any other as    
1416 that may affect correct operation of the imag    
1417 execution context provided by the EFI firmwar    
1418                                                  
1419 The function prototype for the handover entry    
1420                                                  
1421     efi_stub_entry(void *handle, efi_system_t    
1422                                                  
1423 'handle' is the EFI image handle passed to th    
1424 firmware, 'table' is the EFI system table - t    
1425 arguments of the "handoff state" as described    
1426 UEFI specification. 'bp' is the boot loader-a    
1427                                                  
1428 The boot loader *must* fill out the following    
1429                                                  
1430   - hdr.cmd_line_ptr                             
1431   - hdr.ramdisk_image (if applicable)            
1432   - hdr.ramdisk_size  (if applicable)            
1433                                                  
1434 All other fields should be zero.                 
1435                                                  
1436 NOTE: The EFI Handover Protocol is deprecated    
1437       entry point, combined with the LINUX_EF    
1438       loading protocol (refer to [0] for an e    
1439       this), which removes the need for any k    
1440       bootloader regarding the internal repre    
1441       requirements/limitations regarding the     
1442       and ramdisk in memory, or the placement    
1443                                                  
1444 [0] https://github.com/u-boot/u-boot/commit/e    
                                                      

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