MErge mainline into intwrap
This commit is contained in:
		
						commit
						afba9f98ec
					
				
					 719 changed files with 55744 additions and 25714 deletions
				
			
		
							
								
								
									
										55
									
								
								grub-core/lib/i386/halt.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								grub-core/lib/i386/halt.c
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,55 @@ | |||
| /*
 | ||||
|  *  GRUB  --  GRand Unified Bootloader | ||||
|  *  Copyright (C) 2008  Free Software Foundation, Inc. | ||||
|  * | ||||
|  *  GRUB 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, either version 3 of the License, or | ||||
|  *  (at your option) any later version. | ||||
|  * | ||||
|  *  GRUB is distributed in the hope that it will be useful, | ||||
|  *  but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  *  GNU General Public License for more details. | ||||
|  * | ||||
|  *  You should have received a copy of the GNU General Public License | ||||
|  *  along with GRUB.  If not, see <http://www.gnu.org/licenses/>.
 | ||||
|  */ | ||||
| 
 | ||||
| #include <grub/cpu/io.h> | ||||
| #include <grub/misc.h> | ||||
| 
 | ||||
| const char bochs_shutdown[] = "Shutdown"; | ||||
| 
 | ||||
| /*
 | ||||
|  *  This call is special...  it never returns...  in fact it should simply | ||||
|  *  hang at this point! | ||||
|  */ | ||||
| static inline void  __attribute__ ((noreturn)) | ||||
| stop (void) | ||||
| { | ||||
|   asm volatile ("cli"); | ||||
|   while (1) | ||||
|     { | ||||
|       asm volatile ("hlt"); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| void | ||||
| grub_halt (void) | ||||
| { | ||||
|   unsigned int i; | ||||
| 
 | ||||
|   /* Disable interrupts.  */ | ||||
|   __asm__ __volatile__ ("cli"); | ||||
| 
 | ||||
|   /* Bochs, QEMU, etc.  */ | ||||
|   for (i = 0; i < sizeof (bochs_shutdown) - 1; i++) | ||||
|     grub_outb (bochs_shutdown[i], 0x8900); | ||||
| 
 | ||||
|   grub_printf ("GRUB doesn't know how to halt this machine yet!\n"); | ||||
| 
 | ||||
|   /* In order to return we'd have to check what the previous status of IF
 | ||||
|      flag was.  But user most likely doesn't want to return anyway ...  */ | ||||
|   stop (); | ||||
| } | ||||
							
								
								
									
										46
									
								
								grub-core/lib/i386/pc/biosnum.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								grub-core/lib/i386/pc/biosnum.c
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,46 @@ | |||
| /*
 | ||||
|  *  GRUB  --  GRand Unified Bootloader | ||||
|  *  Copyright (C) 2009  Free Software Foundation, Inc. | ||||
|  * | ||||
|  *  GRUB 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, either version 3 of the License, or | ||||
|  *  (at your option) any later version. | ||||
|  * | ||||
|  *  GRUB is distributed in the hope that it will be useful, | ||||
|  *  but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  *  GNU General Public License for more details. | ||||
|  * | ||||
|  *  You should have received a copy of the GNU General Public License | ||||
|  *  along with GRUB.  If not, see <http://www.gnu.org/licenses/>.
 | ||||
|  */ | ||||
| 
 | ||||
| #include <grub/env.h> | ||||
| #include <grub/misc.h> | ||||
| #include <grub/disk.h> | ||||
| 
 | ||||
| static int | ||||
| grub_get_root_biosnumber_default (void) | ||||
| { | ||||
|   char *biosnum; | ||||
|   int ret = -1; | ||||
|   grub_device_t dev; | ||||
| 
 | ||||
|   biosnum = grub_env_get ("biosnum"); | ||||
| 
 | ||||
|   if (biosnum) | ||||
|     return grub_strtoul (biosnum, 0, 0); | ||||
| 
 | ||||
|   dev = grub_device_open (0); | ||||
|   if (dev && dev->disk && dev->disk->dev | ||||
|       && dev->disk->dev->id == GRUB_DISK_DEVICE_BIOSDISK_ID) | ||||
|     ret = (int) dev->disk->id; | ||||
| 
 | ||||
|   if (dev) | ||||
|     grub_device_close (dev); | ||||
| 
 | ||||
|   return ret; | ||||
| } | ||||
| 
 | ||||
| int (*grub_get_root_biosnumber) (void) = grub_get_root_biosnumber_default; | ||||
							
								
								
									
										102
									
								
								grub-core/lib/i386/relocator.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										102
									
								
								grub-core/lib/i386/relocator.c
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,102 @@ | |||
| /*
 | ||||
|  *  GRUB  --  GRand Unified Bootloader | ||||
|  *  Copyright (C) 2009  Free Software Foundation, Inc. | ||||
|  * | ||||
|  *  GRUB 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, either version 3 of the License, or | ||||
|  *  (at your option) any later version. | ||||
|  * | ||||
|  *  GRUB is distributed in the hope that it will be useful, | ||||
|  *  but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  *  GNU General Public License for more details. | ||||
|  * | ||||
|  *  You should have received a copy of the GNU General Public License | ||||
|  *  along with GRUB.  If not, see <http://www.gnu.org/licenses/>.
 | ||||
|  */ | ||||
| 
 | ||||
| #include <grub/mm.h> | ||||
| #include <grub/misc.h> | ||||
| 
 | ||||
| #include <grub/types.h> | ||||
| #include <grub/types.h> | ||||
| #include <grub/err.h> | ||||
| 
 | ||||
| #include <grub/i386/relocator.h> | ||||
| 
 | ||||
| extern grub_uint8_t grub_relocator32_forward_start; | ||||
| extern grub_uint8_t grub_relocator32_forward_end; | ||||
| extern grub_uint8_t grub_relocator32_backward_start; | ||||
| extern grub_uint8_t grub_relocator32_backward_end; | ||||
| 
 | ||||
| extern grub_uint32_t grub_relocator32_backward_dest; | ||||
| extern grub_uint32_t grub_relocator32_backward_size; | ||||
| extern grub_addr_t grub_relocator32_backward_src; | ||||
| 
 | ||||
| extern grub_uint32_t grub_relocator32_forward_dest; | ||||
| extern grub_uint32_t grub_relocator32_forward_size; | ||||
| extern grub_addr_t grub_relocator32_forward_src; | ||||
| 
 | ||||
| extern grub_uint32_t grub_relocator32_forward_eax; | ||||
| extern grub_uint32_t grub_relocator32_forward_ebx; | ||||
| extern grub_uint32_t grub_relocator32_forward_ecx; | ||||
| extern grub_uint32_t grub_relocator32_forward_edx; | ||||
| extern grub_uint32_t grub_relocator32_forward_eip; | ||||
| extern grub_uint32_t grub_relocator32_forward_esp; | ||||
| 
 | ||||
| extern grub_uint32_t grub_relocator32_backward_eax; | ||||
| extern grub_uint32_t grub_relocator32_backward_ebx; | ||||
| extern grub_uint32_t grub_relocator32_backward_ecx; | ||||
| extern grub_uint32_t grub_relocator32_backward_edx; | ||||
| extern grub_uint32_t grub_relocator32_backward_eip; | ||||
| extern grub_uint32_t grub_relocator32_backward_esp; | ||||
| 
 | ||||
| #define RELOCATOR_SIZEOF(x)	(&grub_relocator32_##x##_end - &grub_relocator32_##x##_start) | ||||
| #define RELOCATOR_ALIGN 16 | ||||
| #define PREFIX(x) grub_relocator32_ ## x | ||||
| 
 | ||||
| static void | ||||
| write_call_relocator_bw (void *ptr, void *src, grub_uint32_t dest, | ||||
| 			 grub_size_t size, struct grub_relocator32_state state) | ||||
| { | ||||
|   grub_relocator32_backward_dest = dest; | ||||
|   grub_relocator32_backward_src = PTR_TO_UINT64 (src); | ||||
|   grub_relocator32_backward_size = size; | ||||
| 
 | ||||
|   grub_relocator32_backward_eax = state.eax; | ||||
|   grub_relocator32_backward_ebx = state.ebx; | ||||
|   grub_relocator32_backward_ecx = state.ecx; | ||||
|   grub_relocator32_backward_edx = state.edx; | ||||
|   grub_relocator32_backward_eip = state.eip; | ||||
|   grub_relocator32_backward_esp = state.esp; | ||||
| 
 | ||||
|   grub_memmove (ptr, | ||||
| 		&grub_relocator32_backward_start, | ||||
| 		RELOCATOR_SIZEOF (backward)); | ||||
|   ((void (*) (void)) ptr) (); | ||||
| } | ||||
| 
 | ||||
| static void | ||||
| write_call_relocator_fw (void *ptr, void *src, grub_uint32_t dest, | ||||
| 			 grub_size_t size, struct grub_relocator32_state state) | ||||
| { | ||||
| 
 | ||||
|   grub_relocator32_forward_dest = dest; | ||||
|   grub_relocator32_forward_src = PTR_TO_UINT64 (src); | ||||
|   grub_relocator32_forward_size = size; | ||||
| 
 | ||||
|   grub_relocator32_forward_eax = state.eax; | ||||
|   grub_relocator32_forward_ebx = state.ebx; | ||||
|   grub_relocator32_forward_ecx = state.ecx; | ||||
|   grub_relocator32_forward_edx = state.edx; | ||||
|   grub_relocator32_forward_eip = state.eip; | ||||
|   grub_relocator32_forward_esp = state.esp; | ||||
| 
 | ||||
|   grub_memmove (ptr, | ||||
| 		&grub_relocator32_forward_start, | ||||
| 		RELOCATOR_SIZEOF (forward)); | ||||
|   ((void (*) (void)) ptr) (); | ||||
| } | ||||
| 
 | ||||
| #include "../relocator.c" | ||||
							
								
								
									
										250
									
								
								grub-core/lib/i386/relocator_asm.S
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										250
									
								
								grub-core/lib/i386/relocator_asm.S
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,250 @@ | |||
| /* | ||||
|  *  GRUB  --  GRand Unified Bootloader | ||||
|  *  Copyright (C) 2009  Free Software Foundation, Inc. | ||||
|  * | ||||
|  *  GRUB 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, either version 3 of the License, or | ||||
|  *  (at your option) any later version. | ||||
|  * | ||||
|  *  GRUB is distributed in the hope that it will be useful, | ||||
|  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 | ||||
|  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  *  GNU General Public License for more details. | ||||
|  * | ||||
|  *  You should have received a copy of the GNU General Public License | ||||
|  *  along with GRUB.  If not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
| 
 | ||||
| #include <grub/symbol.h> | ||||
| #include <grub/i386/memory.h> | ||||
| 
 | ||||
| #ifdef BACKWARD | ||||
| #define RELOCATOR_VARIABLE(x) VARIABLE(grub_relocator32_backward_ ## x) | ||||
| #else | ||||
| #define RELOCATOR_VARIABLE(x) VARIABLE(grub_relocator32_forward_ ## x) | ||||
| #endif | ||||
| #ifdef __x86_64__ | ||||
| #define RAX %rax | ||||
| #define RCX %rcx | ||||
| #define RDI %rdi | ||||
| #define RSI %rdi | ||||
| #else | ||||
| #define RAX %eax | ||||
| #define RCX %ecx | ||||
| #define RDI %edi | ||||
| #define RSI %esi | ||||
| #endif | ||||
| 
 | ||||
| /* The code segment of the protected mode.  */ | ||||
| #define CODE_SEGMENT	0x10 | ||||
| 
 | ||||
| /* The data segment of the protected mode.  */ | ||||
| #define DATA_SEGMENT	0x18 | ||||
| 
 | ||||
| 	.p2align	4	/* force 16-byte alignment */ | ||||
| 
 | ||||
| RELOCATOR_VARIABLE(start) | ||||
| #ifdef BACKWARD | ||||
| LOCAL(base): | ||||
| #endif | ||||
| 	cli | ||||
| 
 | ||||
| #ifndef __x86_64__ | ||||
| 	/* mov imm32, %eax */ | ||||
| 	.byte	0xb8
 | ||||
| RELOCATOR_VARIABLE(dest) | ||||
| 	.long	0
 | ||||
| 	movl	%eax, %edi | ||||
| 
 | ||||
| 	/* mov imm32, %eax */ | ||||
| 	.byte	0xb8
 | ||||
| RELOCATOR_VARIABLE(src) | ||||
| 	.long	0
 | ||||
| 	movl	%eax, %esi | ||||
| 
 | ||||
| 	/* mov imm32, %ecx */ | ||||
| 	.byte	0xb9
 | ||||
| RELOCATOR_VARIABLE(size) | ||||
| 	.long	0
 | ||||
| #else | ||||
| 	xorq	%rax, %rax | ||||
| 
 | ||||
| 	/* mov imm32, %eax */ | ||||
| 	.byte	0xb8
 | ||||
| RELOCATOR_VARIABLE(dest) | ||||
| 	.long	0
 | ||||
| 	movq	%rax, %rdi | ||||
| 
 | ||||
| 	/* mov imm64, %rax */ | ||||
| 	.byte	0x48
 | ||||
| 	.byte	0xb8
 | ||||
| RELOCATOR_VARIABLE(src) | ||||
| 	.long	0, 0 | ||||
| 	movq	%rax, %rsi | ||||
| 
 | ||||
| 	xorq	%rcx, %rcx | ||||
| 	/* mov imm32, %ecx */ | ||||
| 	.byte	0xb9
 | ||||
| RELOCATOR_VARIABLE(size) | ||||
| 	.long	0
 | ||||
| 
 | ||||
| #endif | ||||
| 
 | ||||
| 	mov	RDI, RAX | ||||
| 
 | ||||
| #ifdef BACKWARD | ||||
| 	add	RCX, RSI | ||||
| 	add	RCX, RDI | ||||
| #endif | ||||
| 
 | ||||
| #ifndef BACKWARD | ||||
| 	add	RCX, RAX | ||||
| #endif | ||||
| 	add	$0x3, RCX | ||||
| 	shr	$2, RCX | ||||
| 
 | ||||
| 
 | ||||
| #ifdef BACKWARD | ||||
| 	/* Backward movsl is implicitly off-by-four.  compensate that.  */ | ||||
| 	sub	$4,	RSI | ||||
| 	sub	$4,	RDI | ||||
| 
 | ||||
| 	/* Backward copy.  */ | ||||
| 	std | ||||
| 
 | ||||
| 	rep | ||||
| 	movsl | ||||
| 
 | ||||
| #else | ||||
| 	/* Forward copy.  */ | ||||
| 	cld | ||||
| 	rep | ||||
| 	movsl | ||||
| #endif | ||||
| 
 | ||||
| 	/* %rax contains now our new 'base'.  */ | ||||
| 	mov	RAX, RSI | ||||
| 	add	$(LOCAL(cont0) - LOCAL(base)), RAX | ||||
| 	jmp	*RAX | ||||
| LOCAL(cont0): | ||||
| 	lea	(LOCAL(cont1) - LOCAL(base)) (RSI, 1), RAX | ||||
| 	movl	%eax, (LOCAL(jump_vector) - LOCAL(base)) (RSI, 1) | ||||
| 
 | ||||
| 	lea	(LOCAL(gdt) - LOCAL(base)) (RSI, 1), RAX | ||||
| 	mov	RAX, (LOCAL(gdt_addr) - LOCAL(base)) (RSI, 1) | ||||
| 
 | ||||
| 	/* Switch to compatibility mode. */ | ||||
| 
 | ||||
| 	lgdt	(LOCAL(gdtdesc) - LOCAL(base)) (RSI, 1) | ||||
| 
 | ||||
| 	/* Update %cs.  */ | ||||
| 	ljmp	*(LOCAL(jump_vector) - LOCAL(base)) (RSI, 1) | ||||
| 
 | ||||
| LOCAL(cont1): | ||||
| 	.code32 | ||||
| 
 | ||||
| 	/* Update other registers. */ | ||||
| 	movl	$DATA_SEGMENT, %eax | ||||
| 	movl	%eax, %ds | ||||
| 	movl	%eax, %es | ||||
| 	movl	%eax, %fs | ||||
| 	movl	%eax, %gs | ||||
| 	movl	%eax, %ss | ||||
| 
 | ||||
| 	/* Disable paging. */ | ||||
| 	movl	%cr0, %eax | ||||
| 	andl	$(~GRUB_MEMORY_CPU_CR0_PAGING_ON), %eax | ||||
| 	movl	%eax, %cr0 | ||||
| 
 | ||||
| #ifdef __x86_64__ | ||||
| 	/* Disable amd64. */ | ||||
| 	movl	$GRUB_MEMORY_CPU_AMD64_MSR, %ecx | ||||
| 	rdmsr | ||||
| 	andl	$(~GRUB_MEMORY_CPU_AMD64_MSR_ON), %eax | ||||
| 	wrmsr | ||||
| #endif | ||||
| 
 | ||||
| 	/* Turn off PAE. */ | ||||
| 	movl	%cr4, %eax | ||||
| 	andl	$GRUB_MEMORY_CPU_CR4_PAE_ON, %eax | ||||
| 	movl	%eax, %cr4 | ||||
| 
 | ||||
| 	jmp	LOCAL(cont2) | ||||
| LOCAL(cont2): | ||||
| 	.code32 | ||||
| 
 | ||||
| 	/* mov imm32, %eax */ | ||||
| 	.byte	0xb8
 | ||||
| RELOCATOR_VARIABLE (esp) | ||||
| 	.long	0
 | ||||
| 
 | ||||
| 	movl	%eax, %esp | ||||
| 
 | ||||
| 	/* mov imm32, %eax */ | ||||
| 	.byte	0xb8
 | ||||
| RELOCATOR_VARIABLE (eax) | ||||
| 	.long	0
 | ||||
| 
 | ||||
| 	/* mov imm32, %ebx */ | ||||
| 	.byte	0xbb
 | ||||
| RELOCATOR_VARIABLE (ebx) | ||||
| 	.long	0
 | ||||
| 
 | ||||
| 	/* mov imm32, %ecx */ | ||||
| 	.byte	0xb9
 | ||||
| RELOCATOR_VARIABLE (ecx) | ||||
| 	.long	0
 | ||||
| 
 | ||||
| 	/* mov imm32, %edx */ | ||||
| 	.byte	0xba
 | ||||
| RELOCATOR_VARIABLE (edx) | ||||
| 	.long	0
 | ||||
| 
 | ||||
| 	/* Cleared direction flag is of no problem with any current | ||||
| 	   payload and makes this implementation easier.  */ | ||||
| 	cld | ||||
| 
 | ||||
| 	.byte	0xea
 | ||||
| RELOCATOR_VARIABLE (eip) | ||||
| 	.long	0
 | ||||
| 	.word	CODE_SEGMENT
 | ||||
| 
 | ||||
| 	/* GDT. Copied from loader/i386/linux.c. */ | ||||
| 	.p2align	4
 | ||||
| LOCAL(gdt): | ||||
| 	/* NULL.  */ | ||||
| 	.byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 | ||||
| 
 | ||||
| 	/* Reserved.  */ | ||||
| 	.byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 | ||||
| 
 | ||||
| 	/* Code segment.  */ | ||||
| 	.byte 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x9A, 0xCF, 0x00 | ||||
| 
 | ||||
| 	/* Data segment.  */ | ||||
| 	.byte 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x92, 0xCF, 0x00 | ||||
| 
 | ||||
| 	.p2align	4
 | ||||
| LOCAL(gdtdesc): | ||||
| 	.word	0x27
 | ||||
| LOCAL(gdt_addr): | ||||
| #ifdef __x86_64__ | ||||
| 	/* Filled by the code. */ | ||||
| 	.quad	0
 | ||||
| #else | ||||
| 	/* Filled by the code. */ | ||||
| 	.long	0
 | ||||
| #endif | ||||
| 
 | ||||
| 	.p2align	4
 | ||||
| LOCAL(jump_vector): | ||||
| 	/* Jump location. Is filled by the code */ | ||||
| 	.long	0
 | ||||
| 	.long	CODE_SEGMENT
 | ||||
| 
 | ||||
| #ifndef BACKWARD | ||||
| LOCAL(base): | ||||
| #endif | ||||
| 
 | ||||
| RELOCATOR_VARIABLE(end) | ||||
							
								
								
									
										2
									
								
								grub-core/lib/i386/relocator_backward.S
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								grub-core/lib/i386/relocator_backward.S
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,2 @@ | |||
| #define BACKWARD | ||||
| #include "relocator_asm.S" | ||||
							
								
								
									
										56
									
								
								grub-core/lib/i386/setjmp.S
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								grub-core/lib/i386/setjmp.S
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,56 @@ | |||
| /* | ||||
|  *  GRUB  --  GRand Unified Bootloader | ||||
|  *  Copyright (C) 2003,2007  Free Software Foundation, Inc. | ||||
|  * | ||||
|  *  GRUB 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, either version 3 of the License, or | ||||
|  *  (at your option) any later version. | ||||
|  * | ||||
|  *  GRUB is distributed in the hope that it will be useful, | ||||
|  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 | ||||
|  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  *  GNU General Public License for more details. | ||||
|  * | ||||
|  *  You should have received a copy of the GNU General Public License | ||||
|  *  along with GRUB.  If not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
| 
 | ||||
| #include <grub/symbol.h> | ||||
| 
 | ||||
| 	.file	"setjmp.S" | ||||
| 
 | ||||
| 	.text | ||||
| 
 | ||||
| /* | ||||
|  * int grub_setjmp (grub_jmp_buf env) | ||||
|  */ | ||||
| FUNCTION(grub_setjmp) | ||||
| 	movl	%ebx, 0(%eax)	/* EBX */ | ||||
| 	movl	%esi, 4(%eax)	/* ESI */ | ||||
| 	movl	%edi, 8(%eax)	/* EDI */ | ||||
| 	movl	%ebp, 12(%eax)	/* EBP */ | ||||
| 	popl	%ecx | ||||
| 	movl	%esp, 16(%eax)	/* ESP */ | ||||
| 	movl	%ecx, 20(%eax)	/* EIP */ | ||||
| 	xorl	%eax, %eax | ||||
| 	jmp	*%ecx | ||||
| 
 | ||||
| 
 | ||||
| /* | ||||
|  * int grub_longjmp (grub_jmp_buf env, int val) | ||||
|  */ | ||||
| FUNCTION(grub_longjmp) | ||||
| 	movl	0(%eax), %ebx | ||||
| 	movl	4(%eax), %esi | ||||
| 	movl	8(%eax), %edi | ||||
| 	movl	12(%eax), %ebp | ||||
| 	movl	16(%eax), %esp | ||||
| 	movl	20(%eax), %ecx | ||||
| 
 | ||||
| 	movl	%edx, %eax | ||||
| 	testl	%eax, %eax | ||||
| 	jnz	1f | ||||
| 	incl	%eax | ||||
| 1:	jmp	*%ecx | ||||
| 
 | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue