All of lore.kernel.org
 help / color / mirror / Atom feed
* multiboot header error
@ 2007-05-29 18:48 Constantine Kousoulos
  2007-05-30 15:51 ` Constantine Kousoulos
  0 siblings, 1 reply; 3+ messages in thread
From: Constantine Kousoulos @ 2007-05-29 18:48 UTC (permalink / raw)
  To: The development of GRUB 2

After successfully installing GRUB2 from cvs (thanks Jerone!), i 
decided to further test it on my amd64 machine.

At first, i built the sample kernel from 
http://www.gnu.org/software/grub/manual/multiboot/multiboot.html#Example-OS-code 
using the '-m32' gcc flag and by marking boot.S with the '.code32' 
directive. All these effectively created an elf32 image on my 
amd64 machine which built and booted without any trouble. :)

Then i proceeded to check if i can make GRUB2 boot the same kernel 
as a native elf64 image. So, i removed the above mentioned flag 
and directive, renamed any 'pushl' instruction to 'pushq', renamed 
registers 'eax' to 'rex' and 'ebx' to 'rbx', modified the magic 
number (0xe85250d6) and alingned it to 64-bits. When i tried to 
boot it i got: "error: No multiboot header found". :(

Is there something i did or didn't do correctly? I would greatly 
appreciate any feedback!

Thanks,
Constantine



^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: multiboot header error
  2007-05-29 18:48 multiboot header error Constantine Kousoulos
@ 2007-05-30 15:51 ` Constantine Kousoulos
  2007-05-31 18:51   ` Constantine Kousoulos
  0 siblings, 1 reply; 3+ messages in thread
From: Constantine Kousoulos @ 2007-05-30 15:51 UTC (permalink / raw)
  To: The development of GRUB 2

Here is a sample kernel, built as elf64, that simply refuses to 
boot. It consists of only two files: boot.S and multiboot.h. It 
does absolutely nothing and it is a cut-down version of the kernel 
found at 
http://www.gnu.org/software/grub/manual/multiboot/multiboot.html#Example-OS-code 
or in grub-0.97/docs.

boot.S:
#include "multiboot.h"
	.text
	.globl	start, _start
start:
_start:
	jmp	multiboot_entry

	/* Align 64 bits boundary.  */
	.align	8
	
multiboot_header:
	.long	MULTIBOOT_HEADER_MAGIC
	.long	MULTIBOOT_HEADER_FLAGS
/*	.long	-(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS)*/

multiboot_entry:
	/* Initialize the stack pointer.  */
	movq	$(stack + STACK_SIZE), %rsp

	/* Reset EFLAGS.  */
	pushq	$0
	popf

	/* Push the pointer to the Multiboot information structure.  */
	pushq	%rbx
	/* Push the magic value.  */
	pushq	%rax

loop:	hlt
	jmp	loop

	/* Our stack area.  */
	.comm	stack, STACK_SIZE
	
multiboot.h:
#define MULTIBOOT_HEADER_MAGIC		0xe85250d6
#define MULTIBOOT_HEADER_FLAGS		0x00000000
#define STACK_SIZE			0x4000

Makefile.am:
noinst_PROGRAMS = kernel
kernel_SOURCES = boot.S multiboot.h
kernel_CFLAGS = -fno-builtin -nostdinc -O -g -Wall
kernel_LDFLAGS = -nostdlib


All i get from GRUB2 is "error: No multiboot header found". I have 
tried changing the magic number to 0xd65052e8 to make sure i got 
it ok, but it still doesn't boot. The flags are all zero according 
to the next version of the Multiboot Spec. The same document 
doesn't say anything about a checksum in the multiboot header, so 
i commented it out.

What do you think is to blame for this behaviour?

Thanks,
Constantine



^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: multiboot header error
  2007-05-30 15:51 ` Constantine Kousoulos
@ 2007-05-31 18:51   ` Constantine Kousoulos
  0 siblings, 0 replies; 3+ messages in thread
From: Constantine Kousoulos @ 2007-05-31 18:51 UTC (permalink / raw)
  To: The development of GRUB 2

Since i didn't get any feedback, i was forced to use the force and
go to the source. I found out a few amazing things.

First of all, there is a serious inconsistency between the next
version of the Multiboot Specification and the current code. The
spec mentions: "[..] The header must start with a 32-bit magic
number 0xe85250d6 in native endian [..]'. However, there is no
such magic number defined in the source code!! No wonder i got
"error: No multiboot header found". Grub2 always checks for the
standard magic number 0x1badb002.

So, after i changed the multiboot header to the old magic number i
got over the annoying error message and stumbled onto another. The
cause of this error is this piece of code from
grub2/loader/i386/pc/multiboot.c (line 210, inside
grub_multiboot_load_elf64() ):

	  if (grub_file_read (file, (void *) ((grub_uint32_t) phdr->p_paddr),
			      phdr->p_filesz)
               != (grub_ssize_t) phdr->p_filesz)
	    return grub_error (GRUB_ERR_BAD_OS,
			       "couldn't read segment from file");


That's right, i get "error: couldn't read segment from file".

For once more i call upon the experience of the Grub2
developers. Is this a bug of grub_read_file()? The loaded elf64
file is so small that it should have no problem fitting into
physical memory. In addition to that, 'objdump -D mykernel' shows
that the kernel is loaded at address 0x400120 which is within the
usable physical RAM map.

Sorry for troubling you with all these emails, but i need to load
  an elf64 kernel for an os project i'm working on.

Thanks,
Constantine







^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2007-05-31 18:54 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-05-29 18:48 multiboot header error Constantine Kousoulos
2007-05-30 15:51 ` Constantine Kousoulos
2007-05-31 18:51   ` Constantine Kousoulos

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.