aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatt Fleming <matt.fleming@intel.com>2011-10-19 10:02:42 +0100
committerMatt Fleming <matt.fleming@intel.com>2011-12-01 13:14:07 +0000
commit323eeba0fada24cbaa99b18e099844c975e1366a (patch)
treebc76f6c23d6f23e225d4887b252bceda8840d335
parent9f51b69d7c0500e04b3c404bb5138a9234810035 (diff)
downloadsyslinux-323eeba0fada24cbaa99b18e099844c975e1366a.tar.gz
syslinux-323eeba0fada24cbaa99b18e099844c975e1366a.tar.xz
syslinux-323eeba0fada24cbaa99b18e099844c975e1366a.zip
core: Reimplement writestr in C
Implement writestr in C instead of asm and move writestr.inc into modules/ because it's required by modules/ver.asm. Signed-off-by: Matt Fleming <matt.fleming@intel.com>
-rw-r--r--core/isolinux.asm48
-rw-r--r--core/pxelinux.asm2
-rw-r--r--core/rawcon.inc75
-rw-r--r--core/writestr.c46
-rw-r--r--modules/ver.asm2
-rw-r--r--modules/writestr.inc (renamed from core/writestr.inc)0
6 files changed, 77 insertions, 96 deletions
diff --git a/core/isolinux.asm b/core/isolinux.asm
index b0b21a3b..8757c0fa 100644
--- a/core/isolinux.asm
+++ b/core/isolinux.asm
@@ -286,7 +286,7 @@ initial_csum: xor edi,edi
call writemsg
mov al,dl
call writehex2
- call crlf
+ call crlf_early
%endif
;
; Initialize spec packet buffers
@@ -326,7 +326,7 @@ initial_csum: xor edi,edi
call writemsg
mov al,byte [sp_drive]
call writehex2
- call crlf
+ call crlf_early
%endif
found_drive:
@@ -393,7 +393,7 @@ found_file:
mov si,offset_msg
call writemsg
call writehex8
- call crlf
+ call crlf_early
%endif
; Load the rest of the file. However, just in case there
@@ -623,7 +623,7 @@ spec_query_failed:
call writemsg
mov al,dl
call writehex2
- call crlf
+ call crlf_early
cmp byte [sp_drive],dl
jne .maybe_broken
@@ -667,7 +667,7 @@ spec_query_failed:
call writemsg
mov al,dl
call writehex2
- call crlf
+ call crlf_early
mov si,trysbm_msg
call writemsg
jmp .found_drive ; Pray that this works...
@@ -690,6 +690,26 @@ writemsg: push ax
pop ax
ret
+writestr_early:
+ pushfd
+ pushad
+.top: lodsb
+ and al,al
+ jz .end
+ call writechr
+ jmp short .top
+.end: popad
+ popfd
+ ret
+
+crlf_early: push ax
+ mov al,CR
+ call writechr
+ mov al,LF
+ call writechr
+ pop ax
+ ret
+
;
; Write a character to the screen. There is a more "sophisticated"
; version of this in the subsequent code, so we patch the pointer
@@ -1004,7 +1024,7 @@ xint13: mov byte [RetryCount],retry_count
call writestr_early
mov al,dl
call writehex2
- call crlf
+ call crlf_early
; Fall through to kaboom
;
@@ -1016,8 +1036,8 @@ disk_error:
kaboom:
RESET_STACK_AND_SEGS AX
mov si,err_bootfailed
- call writestr
- call getchar
+ pm_call pm_writestr
+ pm_call pm_getchar
cli
mov word [BIOS_magic],0 ; Cold reboot
jmp 0F000h:0FFF0h ; Reset vector address
@@ -1026,8 +1046,6 @@ kaboom:
; Common modules needed in the first sector
; -----------------------------------------------------------------------------
-%include "writestr.inc" ; String output
-writestr_early equ writestr
%include "writehex.inc" ; Hexadecimal output
; -----------------------------------------------------------------------------
@@ -1106,18 +1124,10 @@ all_read:
;
%include "init.inc"
- ; Patch the writechr routine to point to the full code
- mov di,writechr
- mov al,0e9h
- stosb
- mov ax,writechr_full-2
- sub ax,di
- stosw
-
; Tell the user we got this far...
%ifndef DEBUG_MESSAGES ; Gets messy with debugging on
mov si,copyright_str
- call writestr_early
+ pm_call pm_writestr
%endif
;
diff --git a/core/pxelinux.asm b/core/pxelinux.asm
index 8a95d1e9..178e3545 100644
--- a/core/pxelinux.asm
+++ b/core/pxelinux.asm
@@ -343,7 +343,7 @@ kaboom:
pop cx
loop .wait1
.keypress:
- call crlf
+ pm_call crlf
mov word [BIOS_magic],0 ; Cold reboot
jmp 0F000h:0FFF0h ; Reset vector address
diff --git a/core/rawcon.inc b/core/rawcon.inc
deleted file mode 100644
index f0d434c8..00000000
--- a/core/rawcon.inc
+++ /dev/null
@@ -1,75 +0,0 @@
-;
-; writechr: Write a single character in AL to the console without
-; mangling any registers. This does raw console writes,
-; since some PXE BIOSes seem to interfere regular console I/O.
-;
-%if IS_ISOLINUX
-writechr_full:
-%else
-writechr:
-%endif
- pushfd
- push ds
- push cs
- pop ds
- test byte [UsingVGA], 08h
- jz .videook
- call vgaclearmode
-.videook:
- call write_serial ; write to serial port if needed
- test byte [DisplayCon],01h ; Write to screen?
- jz .nothing
-
- pushad
- mov bh,[BIOS_page]
- push ax
- mov ah,03h ; Read cursor position
- int 10h
- pop ax
- cmp al,8
- je .bs
- cmp al,13
- je .cr
- cmp al,10
- je .lf
- push dx
- mov bh,[BIOS_page]
- mov bl,07h ; White on black
- mov cx,1 ; One only
- mov ah,09h ; Write char and attribute
- int 10h
- pop dx
- inc dl
- cmp dl,[VidCols]
- jna .curxyok
- xor dl,dl
-.lf: inc dh
- cmp dh,[VidRows]
- ja .scroll
-.curxyok: mov bh,[BIOS_page]
- mov ah,02h ; Set cursor position
- int 10h
-.ret: popad
-.nothing:
- pop ds
- popfd
- ret
-.scroll: dec dh
- mov bh,[BIOS_page]
- mov ah,02h
- int 10h
- mov ax,0601h ; Scroll up one line
- mov bh,[ScrollAttribute]
- xor cx,cx
- mov dx,[ScreenSize] ; The whole screen
- int 10h
- jmp short .ret
-.cr: xor dl,dl
- jmp short .curxyok
-.bs: sub dl,1
- jnc .curxyok
- mov dl,[VidCols]
- sub dh,1
- jnc .curxyok
- xor dh,dh
- jmp short .curxyok
diff --git a/core/writestr.c b/core/writestr.c
new file mode 100644
index 00000000..66d126af
--- /dev/null
+++ b/core/writestr.c
@@ -0,0 +1,46 @@
+/*
+ * -----------------------------------------------------------------------
+ *
+ * Copyright 1994-2008 H. Peter Anvin - All Rights Reserved
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, Inc., 53 Temple Place Ste 330,
+ * Boston MA 02111-1307, USA; either version 2 of the License, or
+ * (at your option) any later version; incorporated herein by reference.
+ *
+ * -----------------------------------------------------------------------
+ *
+ *
+ * writestr.c
+ *
+ * Code to write a simple string.
+ */
+#include <com32.h>
+
+/*
+ * crlf: Print a newline
+ */
+void crlf(void)
+{
+ writechr('\r');
+ writechr('\n');
+}
+
+/*
+ * writestr: write a null-terminated string to the console, saving
+ * registers on entry.
+ *
+ * Note: writestr_early and writestr are distinct in
+ * SYSLINUX and EXTLINUX, but not PXELINUX and ISOLINUX
+ */
+void writestr(char *str)
+{
+ while (*str)
+ writechr(*str++);
+}
+
+void pm_writestr(com32sys_t *regs)
+{
+ writestr(MK_PTR(regs->ds, regs->esi.w[0]));
+}
diff --git a/modules/ver.asm b/modules/ver.asm
index 8ef63faf..600def02 100644
--- a/modules/ver.asm
+++ b/modules/ver.asm
@@ -565,7 +565,7 @@ is_zf:
ret
%include "../core/macros.inc" ; CR/LF
-%include "../core/writestr.inc" ; String output
+%include "writestr.inc" ; String output
%include "../core/writehex.inc" ; Hexadecimal output
%include "../core/writedec.inc" ; Decimal output
diff --git a/core/writestr.inc b/modules/writestr.inc
index 9c11b320..9c11b320 100644
--- a/core/writestr.inc
+++ b/modules/writestr.inc