mirror of https://github.com/ipxe/ipxe.git
Modified calling convention: we now update %esi and %edi just like a
"rep movsb".pull/1/head
parent
3feac9465e
commit
b37e267d1b
|
@ -21,15 +21,15 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* This file provides the decompress_block() and decompress_block16()
|
* This file provides the decompress() and decompress16() functions
|
||||||
* functions which can be called in order to decompress an image
|
* which can be called in order to decompress an image compressed with
|
||||||
* compressed with the nrv2b utility in src/util.
|
* the nrv2b utility in src/util.
|
||||||
*
|
*
|
||||||
* These functions are designed to be called by the prefix. They are
|
* These functions are designed to be called by the prefix. They are
|
||||||
* position-independent code.
|
* position-independent code.
|
||||||
*
|
*
|
||||||
* The same basic assembly code is used to compile both
|
* The same basic assembly code is used to compile both
|
||||||
* decompress_block() and decompress_block16().
|
* decompress() and decompress16().
|
||||||
****************************************************************************
|
****************************************************************************
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -39,57 +39,58 @@
|
||||||
|
|
||||||
#ifdef CODE16
|
#ifdef CODE16
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* decompress_block16 (real-mode near call, position independent)
|
* decompress16 (real-mode near call, position independent)
|
||||||
|
*
|
||||||
|
* Decompress data in 16-bit mode
|
||||||
*
|
*
|
||||||
* Parameters (passed via registers):
|
* Parameters (passed via registers):
|
||||||
* %ds:%si - Pointer to compressed input data
|
* %ds:%esi - Start of compressed input data
|
||||||
* %es:%di - Pointer to output buffer
|
* %es:%edi - Start of output buffer
|
||||||
* Returns:
|
* Returns:
|
||||||
* All registers are preserved
|
* %ds:%esi - End of compressed input data
|
||||||
|
* %es:%edi - End of decompressed output data
|
||||||
|
* All other registers are preserved
|
||||||
*
|
*
|
||||||
* NOTE: The compressed data size must be in the range [1,65533-%si]
|
* NOTE: It would be possible to build a smaller version of the
|
||||||
|
* decompression code for -DKEEP_IT_REAL by using
|
||||||
|
* #define REG(x) x
|
||||||
|
* to use 16-bit registers where possible. This would impose limits
|
||||||
|
* that the compressed data size must be in the range [1,65533-%si]
|
||||||
* and the uncompressed data size must be in the range [1,65536-%di]
|
* and the uncompressed data size must be in the range [1,65536-%di]
|
||||||
* (where %si and %di are the input values for those registers). Note
|
* (where %si and %di are the input values for those registers). Note
|
||||||
* particularly that the lower limit is 1, not 0, and that the upper
|
* particularly that the lower limit is 1, not 0, and that the upper
|
||||||
* limit on the input (compressed) data really is 65533, since the
|
* limit on the input (compressed) data really is 65533, since the
|
||||||
* algorithm may read up to three bytes beyond the end of the input
|
* algorithm may read up to three bytes beyond the end of the input
|
||||||
* data, since it reads dwords.
|
* data, since it reads dwords.
|
||||||
*
|
|
||||||
* Although splitting up the data into (almost) 64kB chunks for
|
|
||||||
* compression is awkward and worsens the compression ratio, it has
|
|
||||||
* little to no practical effect since our image size is currently
|
|
||||||
* <64kB for all single drivers. Having a decompression routine that
|
|
||||||
* can run in real-mode avoids the need to duplicate RM-to-PM
|
|
||||||
* transition code from librm (or have part of librm kept
|
|
||||||
* uncompressed, which is itself awkward) and means that we don't need
|
|
||||||
* to set up the PM stack until we hit the setup routine itself.
|
|
||||||
****************************************************************************
|
****************************************************************************
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define REG(x) x
|
#define REG(x) e ## x
|
||||||
|
|
||||||
.code16
|
.code16
|
||||||
.globl decompress_block16
|
.globl decompress16
|
||||||
decompress_block16:
|
decompress16:
|
||||||
|
|
||||||
#else /* CODE16 */
|
#else /* CODE16 */
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* decompress_block (32-bit protected-mode near call, position independent)
|
* decompress (32-bit protected-mode near call, position independent)
|
||||||
*
|
*
|
||||||
* Parameters (passed via registers):
|
* Parameters (passed via registers):
|
||||||
* %ds:%esi - Pointer to compressed input data
|
* %ds:%esi - Start of compressed input data
|
||||||
* %es:%edi - Pointer to output buffer
|
* %es:%edi - Start of output buffer
|
||||||
* Returns:
|
* Returns:
|
||||||
* All registers are preserved
|
* %ds:%esi - End of compressed input data
|
||||||
|
* %es:%edi - End of decompressed output data
|
||||||
|
* All other registers are preserved
|
||||||
****************************************************************************
|
****************************************************************************
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define REG(x) e ## x
|
#define REG(x) e ## x
|
||||||
|
|
||||||
.code32
|
.code32
|
||||||
.globl decompress_block
|
.globl decompress
|
||||||
decompress_block:
|
decompress:
|
||||||
|
|
||||||
#endif /* CODE16 */
|
#endif /* CODE16 */
|
||||||
|
|
||||||
|
@ -100,7 +101,10 @@ decompress_block:
|
||||||
#define xDI REG(di)
|
#define xDI REG(di)
|
||||||
|
|
||||||
/* Save registers */
|
/* Save registers */
|
||||||
pushal
|
push %xAX
|
||||||
|
pushl %ebx
|
||||||
|
push %xCX
|
||||||
|
push %xBP
|
||||||
/* Do the decompression */
|
/* Do the decompression */
|
||||||
cld
|
cld
|
||||||
xor %xBP, %xBP
|
xor %xBP, %xBP
|
||||||
|
@ -169,5 +173,8 @@ getbit32:
|
||||||
|
|
||||||
decompr_end_n2b:
|
decompr_end_n2b:
|
||||||
/* Restore registers and return */
|
/* Restore registers and return */
|
||||||
popal
|
pop %xBP
|
||||||
|
pop %xCX
|
||||||
|
popl %ebx
|
||||||
|
pop %xAX
|
||||||
ret
|
ret
|
||||||
|
|
Loading…
Reference in New Issue