intwrap grub_get_mmap_entry
This commit is contained in:
		
							parent
							
								
									0d06476b05
								
							
						
					
					
						commit
						f632937ab5
					
				
					 3 changed files with 47 additions and 93 deletions
				
			
		|  | @ -23,11 +23,6 @@ | ||||||
| #include <grub/symbol.h> | #include <grub/symbol.h> | ||||||
| #include <grub/machine/memory.h> | #include <grub/machine/memory.h> | ||||||
| 
 | 
 | ||||||
| /* Get a memory map entry. Return next continuation value. Zero means
 |  | ||||||
|    the end.  */ |  | ||||||
| grub_uint32_t grub_get_mmap_entry (struct grub_machine_mmap_entry *entry, |  | ||||||
| 				   grub_uint32_t cont); |  | ||||||
| 
 |  | ||||||
| /* Turn on/off Gate A20.  */ | /* Turn on/off Gate A20.  */ | ||||||
| void grub_gate_a20 (int on); | void grub_gate_a20 (int on); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -61,6 +61,53 @@ grub_get_eisa_mmap (void) | ||||||
|   return (regs.eax & 0xffff) | (regs.ebx << 16); |   return (regs.eax & 0xffff) | (regs.ebx << 16); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | /*
 | ||||||
|  |  * | ||||||
|  |  * grub_get_mmap_entry(addr, cont) : address and old continuation value (zero to | ||||||
|  |  *		start), for the Query System Address Map BIOS call. | ||||||
|  |  * | ||||||
|  |  *  Sets the first 4-byte int value of "addr" to the size returned by | ||||||
|  |  *  the call.  If the call fails, sets it to zero. | ||||||
|  |  * | ||||||
|  |  *	Returns:  new (non-zero) continuation value, 0 if done. | ||||||
|  |  */ | ||||||
|  | /* Get a memory map entry. Return next continuation value. Zero means
 | ||||||
|  |    the end.  */ | ||||||
|  | static grub_uint32_t | ||||||
|  | grub_get_mmap_entry (struct grub_machine_mmap_entry *entry, | ||||||
|  | 		     grub_uint32_t cont) | ||||||
|  | { | ||||||
|  |   struct grub_bios_int_registers regs; | ||||||
|  | 
 | ||||||
|  |   regs.flags = GRUB_CPU_INT_FLAGS_DEFAULT; | ||||||
|  | 
 | ||||||
|  |   /* place address (+4) in ES:DI */ | ||||||
|  |   regs.es = ((grub_addr_t) &entry->addr) >> 4; | ||||||
|  |   regs.edi = ((grub_addr_t) &entry->addr) & 0xf; | ||||||
|  | 	 | ||||||
|  |   /* set continuation value */ | ||||||
|  |   regs.ebx = cont; | ||||||
|  | 
 | ||||||
|  |   /* set default maximum buffer size */ | ||||||
|  |   regs.ecx = sizeof (*entry) - sizeof (entry->size); | ||||||
|  | 
 | ||||||
|  |   /* set EDX to 'SMAP' */ | ||||||
|  |   regs.edx = 0x534d4150; | ||||||
|  | 
 | ||||||
|  |   regs.eax = 0xe820; | ||||||
|  |   grub_bios_interrupt (0x15, ®s); | ||||||
|  | 
 | ||||||
|  |   /* write length of buffer (zero if error) into ADDR */	 | ||||||
|  |   if ((regs.flags & GRUB_CPU_INT_FLAGS_CARRY) || regs.eax != 0x534d4150 | ||||||
|  |       || regs.ecx < 0x14 || regs.ecx > 0x400) | ||||||
|  |     entry->size = 0; | ||||||
|  |   else | ||||||
|  |     entry->size = regs.ecx; | ||||||
|  | 
 | ||||||
|  |   /* return the continuation value */ | ||||||
|  |   return regs.ebx; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| grub_err_t | grub_err_t | ||||||
| grub_machine_mmap_iterate (int NESTED_FUNC_ATTR (*hook) (grub_uint64_t, grub_uint64_t, grub_uint32_t)) | grub_machine_mmap_iterate (int NESTED_FUNC_ATTR (*hook) (grub_uint64_t, grub_uint64_t, grub_uint32_t)) | ||||||
| { | { | ||||||
|  |  | ||||||
|  | @ -505,94 +505,6 @@ FUNCTION(grub_chainloader_real_boot) | ||||||
| 
 | 
 | ||||||
| #include "../loader.S" | #include "../loader.S" | ||||||
| 
 | 
 | ||||||
| /* |  | ||||||
|  * |  | ||||||
|  * grub_get_mmap_entry(addr, cont) : address and old continuation value (zero to |  | ||||||
|  *		start), for the Query System Address Map BIOS call. |  | ||||||
|  * |  | ||||||
|  *  Sets the first 4-byte int value of "addr" to the size returned by |  | ||||||
|  *  the call.  If the call fails, sets it to zero. |  | ||||||
|  * |  | ||||||
|  *	Returns:  new (non-zero) continuation value, 0 if done. |  | ||||||
|  */ |  | ||||||
| 
 |  | ||||||
| FUNCTION(grub_get_mmap_entry) |  | ||||||
| 	pushl	%ebp |  | ||||||
| 	pushl	%ebx |  | ||||||
| 	pushl	%edi |  | ||||||
| 	pushl	%esi |  | ||||||
| 
 |  | ||||||
| 	/* push ADDR */ |  | ||||||
| 	pushl	%eax |  | ||||||
| 
 |  | ||||||
| 	/* place address (+4) in ES:DI */ |  | ||||||
| 	addl	$4, %eax |  | ||||||
| 	movl	%eax, %edi |  | ||||||
| 	andl	$0xf, %edi |  | ||||||
| 	shrl	$4, %eax |  | ||||||
| 	movl	%eax, %esi |  | ||||||
| 
 |  | ||||||
| 	/* set continuation value */ |  | ||||||
| 	movl	%edx, %ebx |  | ||||||
| 
 |  | ||||||
| 	/* set default maximum buffer size */ |  | ||||||
| 	movl	$0x14, %ecx |  | ||||||
| 
 |  | ||||||
| 	/* set EDX to 'SMAP' */ |  | ||||||
| 	movl	$0x534d4150, %edx |  | ||||||
| 
 |  | ||||||
| 	call	prot_to_real	/* enter real mode */ |  | ||||||
| 	.code16 |  | ||||||
| 
 |  | ||||||
| 	movw	%si, %es |  | ||||||
| 	movl	$0xe820, %eax |  | ||||||
| 	int	$0x15 |  | ||||||
| 
 |  | ||||||
| 	DATA32	jc	xnosmap |  | ||||||
| 
 |  | ||||||
| 	cmpl	$0x534d4150, %eax |  | ||||||
| 	jne	xnosmap |  | ||||||
| 
 |  | ||||||
| 	cmpl	$0x14, %ecx |  | ||||||
| 	jl	xnosmap |  | ||||||
| 
 |  | ||||||
| 	cmpl	$0x400, %ecx |  | ||||||
| 	jg	xnosmap |  | ||||||
| 
 |  | ||||||
| 	jmp	xsmap |  | ||||||
| 
 |  | ||||||
| xnosmap: |  | ||||||
| 	xorl	%ecx, %ecx |  | ||||||
| 
 |  | ||||||
| /* 	Apple's cc jumps few bytes before the correct |  | ||||||
| 	label in this context. Hence nops. */ |  | ||||||
| #ifdef APPLE_CC |  | ||||||
| 	nop |  | ||||||
| 	nop |  | ||||||
| 	nop |  | ||||||
| 	nop |  | ||||||
| 	nop |  | ||||||
| 	nop |  | ||||||
| #endif |  | ||||||
| 
 |  | ||||||
| xsmap: |  | ||||||
| 	DATA32	call	real_to_prot |  | ||||||
| 	.code32 |  | ||||||
| 
 |  | ||||||
| 	/* write length of buffer (zero if error) into ADDR */ |  | ||||||
| 	popl	%eax |  | ||||||
| 	movl	%ecx, (%eax) |  | ||||||
| 
 |  | ||||||
| 	/* set return value to continuation */ |  | ||||||
| 	movl	%ebx, %eax |  | ||||||
| 
 |  | ||||||
| 	popl	%esi |  | ||||||
| 	popl	%edi |  | ||||||
| 	popl	%ebx |  | ||||||
| 	popl	%ebp |  | ||||||
| 	ret |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| /* | /* | ||||||
|  * void grub_console_real_putchar (int c) |  * void grub_console_real_putchar (int c) | ||||||
|  * |  * | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue