x86: provide stage_exit() like arm
The arm architectures have a stage_exit() function which takes a void * pointer as an entry point. Provide the same API for x86. This can make the booting paths less architecture-specific. Change-Id: I4ecfbf32f38f2e3817381b63e1f97e92654c5f97 Signed-off-by: Aaron Durbin <adurbin@chromium.org> Reviewed-on: http://review.coreboot.org/5086 Tested-by: build bot (Jenkins) Reviewed-by: Patrick Georgi <patrick@georgi-clan.de>
This commit is contained in:
		
				
					committed by
					
						 Aaron Durbin
						Aaron Durbin
					
				
			
			
				
	
			
			
			
						parent
						
							efc5841ab4
						
					
				
				
					commit
					e9aaa71fb1
				
			| @@ -24,4 +24,12 @@ | |||||||
|  |  | ||||||
| void asmlinkage copy_and_run(void); | void asmlinkage copy_and_run(void); | ||||||
| void jmp_to_elf_entry(void *entry, unsigned long buffer, unsigned long size); | void jmp_to_elf_entry(void *entry, unsigned long buffer, unsigned long size); | ||||||
|  |  | ||||||
|  | static inline void stage_exit(void *entry) | ||||||
|  | { | ||||||
|  | 	__asm__ volatile ( | ||||||
|  | 		"jmp  *%%edi\n" | ||||||
|  | 		:: "D"(entry) | ||||||
|  | 	); | ||||||
|  | } | ||||||
| #endif | #endif | ||||||
|   | |||||||
| @@ -34,10 +34,7 @@ static void cbfs_and_run_core(const char *filename) | |||||||
|  |  | ||||||
| 	timestamp_add_now(TS_END_COPYRAM); | 	timestamp_add_now(TS_END_COPYRAM); | ||||||
| 	print_debug("Jumping to image.\n"); | 	print_debug("Jumping to image.\n"); | ||||||
| 	__asm__ volatile ( | 	stage_exit(dst); | ||||||
| 		"jmp  *%%edi\n" |  | ||||||
| 		:: "D"(dst) |  | ||||||
| 	); |  | ||||||
| } | } | ||||||
|  |  | ||||||
| void asmlinkage copy_and_run(void) | void asmlinkage copy_and_run(void) | ||||||
|   | |||||||
| @@ -17,6 +17,7 @@ | |||||||
|  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA |  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
|  | #include <arch/stages.h> | ||||||
| #include <stdint.h> | #include <stdint.h> | ||||||
| #include <stddef.h> | #include <stddef.h> | ||||||
| #include <cbfs.h> | #include <cbfs.h> | ||||||
| @@ -180,11 +181,7 @@ static void vboot_load_ramstage(struct vboot_handoff *vboot_handoff, | |||||||
|  |  | ||||||
| 	timestamp_add_now(TS_END_COPYRAM); | 	timestamp_add_now(TS_END_COPYRAM); | ||||||
|  |  | ||||||
| 	__asm__ volatile ( | 	stage_exit(rmod_load.entry); | ||||||
| 		"movl $0, %%ebp\n" |  | ||||||
| 		"jmp  *%%edi\n" |  | ||||||
| 		:: "D"(rmod_load.entry) |  | ||||||
| 	); |  | ||||||
| } | } | ||||||
|  |  | ||||||
| void vboot_verify_firmware(struct romstage_handoff *handoff) | void vboot_verify_firmware(struct romstage_handoff *handoff) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user