diff options
-rw-r--r-- | com32/lib/syslinux/load_linux.c | 3 | ||||
-rw-r--r-- | core/bootsect.inc | 6 | ||||
-rw-r--r-- | core/runkernel.inc | 16 |
3 files changed, 20 insertions, 5 deletions
diff --git a/com32/lib/syslinux/load_linux.c b/com32/lib/syslinux/load_linux.c index db985163..df793625 100644 --- a/com32/lib/syslinux/load_linux.c +++ b/com32/lib/syslinux/load_linux.c @@ -253,6 +253,9 @@ int syslinux_boot_linux(void *kernel_buf, size_t kernel_size, case 'n': /* "normal" */ video_mode = 0xffff; break; + case 'c': /* "current" */ + video_mode = 0x0f04; + break; default: video_mode = strtoul(arg, NULL, 0); break; diff --git a/core/bootsect.inc b/core/bootsect.inc index 23b4fdb4..b8102cd5 100644 --- a/core/bootsect.inc +++ b/core/bootsect.inc @@ -120,6 +120,12 @@ replace_bootstrap: ; Prepare for shutting down ; call vgaclearmode + +; +; We jump here when loading a kernel image, so that we don't reset +; the screen mode in "quiet" mode +; +replace_bootstrap_noclearmode: call cleanup_hardware ; diff --git a/core/runkernel.inc b/core/runkernel.inc index 68ab9fac..568b9658 100644 --- a/core/runkernel.inc +++ b/core/runkernel.inc @@ -138,15 +138,18 @@ parse_cmdline: jmp .next_opt opt_vga: - mov eax,[es:di-1] + mov ax,[es:di-1] mov bx,-1 - cmp eax,'=nor' ; vga=normal + cmp ax,'=nor' ; vga=normal je .vc0 dec bx ; bx <- -2 - cmp eax,'=ext' ; vga=ext + cmp ax,'=ext' ; vga=ext je .vc0 dec bx ; bx <- -3 - cmp eax,'=ask' ; vga=ask + cmp ax,'=ask' ; vga=ask + je .vc0 + mov bx,0x0f04 ; bx <- 0x0f04 (current mode) + cmp ax,'=cur' ; vga=current je .vc0 call parseint_esdi ; vga=<number> jc .skip ; Not an integer @@ -454,7 +457,10 @@ setup_move: ; BX points to the final real mode segment, and will be loaded ; into DS. - jmp replace_bootstrap + + test byte [QuietBoot],01h ; Don't clear the mode if quiet + jz replace_bootstrap + jmp replace_bootstrap_noclearmode run_linux_kernel: ; |