Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 71959
b: refs/heads/master
c: a24e785
h: refs/heads/master
i:
  71957: 720d13f
  71955: 8593f7a
  71951: 1e3d6a9
v: v3
  • Loading branch information
Rusty Russell authored and Linus Torvalds committed Oct 22, 2007
1 parent cf60c74 commit b4f4935
Show file tree
Hide file tree
Showing 5 changed files with 64 additions and 7 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 214541d1f30429922727040db3e2e4932ff24f46
refs/heads/master: a24e785111a32ccb7cebafd24b1b1cb474ea8e5d
15 changes: 13 additions & 2 deletions trunk/arch/x86/boot/compressed/head_32.S
Original file line number Diff line number Diff line change
Expand Up @@ -27,20 +27,31 @@
#include <asm/segment.h>
#include <asm/page.h>
#include <asm/boot.h>
#include <asm/asm-offsets.h>

.section ".text.head","ax",@progbits
.globl startup_32

startup_32:
cld
cli
/* 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

1: cli
movl $(__BOOT_DS),%eax
movl %eax,%ds
movl %eax,%es
movl %eax,%fs
movl %eax,%gs
movl %eax,%ss

2: cld

/* Calculate the delta between where we were compiled to run
* at and where we were actually loaded at. This can only be done
* with a short local call on x86. Nothing else will tell us what
Expand Down
3 changes: 3 additions & 0 deletions trunk/arch/x86/boot/compressed/misc_32.c
Original file line number Diff line number Diff line change
Expand Up @@ -247,6 +247,9 @@ static void putstr(const char *s)
int x,y,pos;
char c;

if (RM_SCREEN_INFO.orig_video_mode == 0 && lines == 0 && cols == 0)
return;

x = RM_SCREEN_INFO.orig_x;
y = RM_SCREEN_INFO.orig_y;

Expand Down
7 changes: 6 additions & 1 deletion trunk/arch/x86/boot/header.S
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,7 @@ _start:
# Part 2 of the header, from the old setup.S

.ascii "HdrS" # header signature
.word 0x0206 # header version number (>= 0x0105)
.word 0x0207 # header version number (>= 0x0105)
# or else old loadlin-1.5 will fail)
.globl realmode_swtch
realmode_swtch: .word 0, 0 # default_switch, SETUPSEG
Expand Down Expand Up @@ -214,6 +214,11 @@ cmdline_size: .long COMMAND_LINE_SIZE-1 #length of the command line,
#added with boot protocol
#version 2.06

hardware_subarch: .long 0 # subarchitecture, added with 2.07
# default to 0 for normal x86 PC

hardware_subarch_data: .quad 0

# End of setup header #####################################################

.section ".inittext", "ax"
Expand Down
44 changes: 41 additions & 3 deletions trunk/arch/x86/kernel/head_32.S
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand All @@ -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 */
Expand Down

0 comments on commit b4f4935

Please sign in to comment.