|
@@ -79,22 +79,30 @@ INIT_MAP_BEYOND_END = BOOTBITMAP_SIZE + (PAGE_TABLE_SIZE + ALLOCATOR_SLOP)*PAGE_
|
|
|
*/
|
|
|
.section .text.head,"ax",@progbits
|
|
|
ENTRY(startup_32)
|
|
|
+ /* check to see if KEEP_SEGMENTS flag is meaningful */
|
|
|
+ cmpw $0x207, BP_version(%esi)
|
|
|
+ jb 1f
|
|
|
+
|
|
|
+ /* test KEEP_SEGMENTS flag to see if the bootloader is asking
|
|
|
+ us to not reload segments */
|
|
|
+ testb $(1<<6), BP_loadflags(%esi)
|
|
|
+ jnz 2f
|
|
|
|
|
|
/*
|
|
|
* Set segments to known values.
|
|
|
*/
|
|
|
- cld
|
|
|
- lgdt boot_gdt_descr - __PAGE_OFFSET
|
|
|
+1: lgdt boot_gdt_descr - __PAGE_OFFSET
|
|
|
movl $(__BOOT_DS),%eax
|
|
|
movl %eax,%ds
|
|
|
movl %eax,%es
|
|
|
movl %eax,%fs
|
|
|
movl %eax,%gs
|
|
|
+2:
|
|
|
|
|
|
/*
|
|
|
* Clear BSS first so that there are no surprises...
|
|
|
- * No need to cld as DF is already clear from cld above...
|
|
|
*/
|
|
|
+ cld
|
|
|
xorl %eax,%eax
|
|
|
movl $__bss_start - __PAGE_OFFSET,%edi
|
|
|
movl $__bss_stop - __PAGE_OFFSET,%ecx
|
|
@@ -128,6 +136,35 @@ ENTRY(startup_32)
|
|
|
movsl
|
|
|
1:
|
|
|
|
|
|
+#ifdef CONFIG_PARAVIRT
|
|
|
+ cmpw $0x207, (boot_params + BP_version - __PAGE_OFFSET)
|
|
|
+ jb default_entry
|
|
|
+
|
|
|
+ /* Paravirt-compatible boot parameters. Look to see what architecture
|
|
|
+ we're booting under. */
|
|
|
+ movl (boot_params + BP_hardware_subarch - __PAGE_OFFSET), %eax
|
|
|
+ cmpl $num_subarch_entries, %eax
|
|
|
+ jae bad_subarch
|
|
|
+
|
|
|
+ movl subarch_entries - __PAGE_OFFSET(,%eax,4), %eax
|
|
|
+ subl $__PAGE_OFFSET, %eax
|
|
|
+ jmp *%eax
|
|
|
+
|
|
|
+bad_subarch:
|
|
|
+WEAK(lguest_entry)
|
|
|
+WEAK(xen_entry)
|
|
|
+ /* Unknown implementation; there's really
|
|
|
+ nothing we can do at this point. */
|
|
|
+ ud2a
|
|
|
+.data
|
|
|
+subarch_entries:
|
|
|
+ .long default_entry /* normal x86/PC */
|
|
|
+ .long lguest_entry /* lguest hypervisor */
|
|
|
+ .long xen_entry /* Xen hypervisor */
|
|
|
+num_subarch_entries = (. - subarch_entries) / 4
|
|
|
+.previous
|
|
|
+#endif /* CONFIG_PARAVIRT */
|
|
|
+
|
|
|
/*
|
|
|
* Initialize page tables. This creates a PDE and a set of page
|
|
|
* tables, which are located immediately beyond _end. The variable
|
|
@@ -140,6 +177,7 @@ ENTRY(startup_32)
|
|
|
*/
|
|
|
page_pde_offset = (__PAGE_OFFSET >> 20);
|
|
|
|
|
|
+default_entry:
|
|
|
movl $(pg0 - __PAGE_OFFSET), %edi
|
|
|
movl $(swapper_pg_dir - __PAGE_OFFSET), %edx
|
|
|
movl $0x007, %eax /* 0x007 = PRESENT+RW+USER */
|