summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/arch/i386/prefix/unlzma.S69
1 files changed, 50 insertions, 19 deletions
diff --git a/src/arch/i386/prefix/unlzma.S b/src/arch/i386/prefix/unlzma.S
index b0588fdac..f4cbcdac5 100644
--- a/src/arch/i386/prefix/unlzma.S
+++ b/src/arch/i386/prefix/unlzma.S
@@ -55,25 +55,58 @@ FILE_LICENCE ( GPL2_OR_LATER );
#endif /* CODE16 */
/****************************************************************************
- * Debugging (via 0xe9 debug port)
+ * Debugging
****************************************************************************
+ *
+ * This code will usually run in 16-bit protected mode, in which case
+ * only the 0xe9 debug port (present on some virtual machines) can be
+ * used.
+ *
+ * To debug on real hardware, build with DEBUG=libprefix. This will
+ * cause this code to be called in flat real mode, and so DEBUG_INT10
+ * may be used.
*/
-#define DEBUG 0
+/* Enable debugging via 0xe9 debug port */
+#define DEBUG_E9 0
-#if DEBUG
- .macro print_character, char
+/* Enable debugging via BIOS INT 10 (works only when in flat real mode) */
+#define DEBUG_INT10 0
+
+#if ( DEBUG_E9 || DEBUG_INT10 )
+ .macro print_character, reg
+ pushfl
pushw %ax
- movb $\char, %al
+ pushw %bx
+ pushw %bp
+ movb \reg, %al
+ movw $0x0007, %bx
+ movb $0x0e, %ah
+#if DEBUG_E9
outb %al, $0xe9
+#endif
+#if DEBUG_INT10
+ cmpb $('\n'), %al
+ jne L\@
+ int $0x10
+ movb $('\r'), %al
+L\@: int $0x10
+#endif
+ popw %bp
+ popw %bx
popw %ax
+ popfl
.endm
.macro print_hex_nibble
+ pushfl
+ pushw %ax
cmpb $10, %al
sbb $0x69, %al
das
- outb %al, $0xe9
+ print_character %al
+ popw %ax
+ popfl
.endm
.macro print_hex_byte, reg
@@ -205,8 +238,6 @@ literal: .rept ( ( 1 << LZMA_LC ) * 0x300 )
* Returns:
* %ds:%esi : compressed input data pointer (possibly updated)
* %eax : current range
- * Corrupts:
- * %eax
*****************************************************************************
*/
rc_normalise:
@@ -476,7 +507,7 @@ lzma_literal:
/* Store output byte */
ADDR32 stosb
print_hex_byte %al
- print_character ' '
+ print_character $(' ')
/* Update LZMA state */
subb $3, %dl
jns 1f
@@ -562,14 +593,14 @@ lzma_len:
*****************************************************************************
*/
match: /* Update repeated match list */
- print_character '['
+ print_character $('[')
movl $3, %ecx
jmp 1f
match_rep:
- print_character '['
- print_character 'R'
+ print_character $('[')
+ print_character $('R')
print_hex_byte %cl
- print_character '='
+ print_character $('=')
movzbl %cl, %ecx
movl reps(%ebp,%ecx,4), %eax
jcxz 2f
@@ -582,10 +613,10 @@ match_rep:
/* Get stored match length */
movzwl len(%ebp), %ecx
print_hex_dword %eax
- print_character '+'
+ print_character $('+')
print_hex_word %cx
- print_character ']'
- print_character ' '
+ print_character $(']')
+ print_character $(' ')
/* Abort with CF set if match distance is out of range */
movl out_start(%ebp), %esi
negl %esi
@@ -872,13 +903,13 @@ decompress:
/* Initialise remaining parameters */
movl %esi, in_start(%ebp)
movl %edi, out_start(%ebp)
- print_character '\n'
+ print_character $('\n')
ADDR32 lodsb /* discard initial byte */
print_hex_byte %al
ADDR32 lodsl
bswapl %eax
print_hex_dword %eax
- print_character '\n'
+ print_character $('\n')
movl %eax, rc_code(%ebp)
decl rc_range(%ebp)
movl $STATE_LIT_LIT, %edx
@@ -886,7 +917,7 @@ decompress:
call lzma_decode
jnc 1b
call rc_normalise
- print_character '\n'
+ print_character $('\n')
/* Undo BCJ filter */
pushl %esi
movl out_start(%ebp), %esi