mirror of
				https://github.com/xcat2/xNBA.git
				synced 2025-10-30 10:52:35 +00:00 
			
		
		
		
	[prefix] Use %cs as implicit parameter to uninstall()
romprefix.S currently calls uninstall() with an invalid value in %ax. Consequently, base memory is not freed after a ROM boot attempt (or after entering iPXE during POST). The uninstall() function is physically present in .text16, and so can use %cs to determine the .text16 segment address. The .data16 segment address is not required, since uninstall() is called only by code paths which set up .data16 to immediately follow .text16. Signed-off-by: Michael Brown <mcb30@ipxe.org>
This commit is contained in:
		| @@ -545,8 +545,7 @@ alloc_basemem: | ||||
|  * Free space allocated with alloc_basemem. | ||||
|  * | ||||
|  * Parameters: | ||||
|  *   %ax : .text16 segment address | ||||
|  *   %bx : .data16 segment address | ||||
|  *   none (.text16 segment address is implicit in %cs) | ||||
|  * Returns: | ||||
|  *   %ax : 0 if successfully freed | ||||
|  * Corrupts: | ||||
| @@ -559,14 +558,14 @@ alloc_basemem: | ||||
| free_basemem: | ||||
| 	/* Preserve registers */ | ||||
| 	pushw	%fs | ||||
| 	pushw	%ax | ||||
|  | ||||
| 	/* Check FBMS counter */ | ||||
| 	pushw	%ax | ||||
| 	movw	%cs, %ax | ||||
| 	shrw	$6, %ax | ||||
| 	pushw	$0x40 | ||||
| 	popw	%fs | ||||
| 	cmpw	%ax, %fs:0x13 | ||||
| 	popw	%ax | ||||
| 	jne	1f | ||||
|  | ||||
| 	/* Check hooked interrupt count */ | ||||
| @@ -574,6 +573,7 @@ free_basemem: | ||||
| 	jne	1f | ||||
|  | ||||
| 	/* OK to free memory */ | ||||
| 	movw	%cs, %ax | ||||
| 	addw	$_text16_memsz_pgh, %ax | ||||
| 	addw	$_data16_memsz_pgh, %ax | ||||
| 	shrw	$6, %ax | ||||
| @@ -581,6 +581,7 @@ free_basemem: | ||||
| 	xorw	%ax, %ax | ||||
|  | ||||
| 1:	/* Restore registers and return */ | ||||
| 	popw	%ax | ||||
| 	popw	%fs | ||||
| 	ret | ||||
| 	.size free_basemem, . - free_basemem | ||||
| @@ -872,8 +873,7 @@ close_payload: | ||||
|  * Uninstall all text and data segments. | ||||
|  * | ||||
|  * Parameters: | ||||
|  *   %ax  : .text16 segment address | ||||
|  *   %bx  : .data16 segment address | ||||
|  *   none (.text16 segment address is implicit in %cs) | ||||
|  * Returns: | ||||
|  *   none | ||||
|  * Corrupts: | ||||
|   | ||||
		Reference in New Issue
	
	Block a user