I was testing the kernel example code of the multiboot specification, and found that it prints wrong memory base_addr and length values. In the code found at the URLs:
https://www.gnu.org/software/grub/manual/multiboot/html_node/kernel_002ec.html and, among others, https://www.gnu.org/software/grub/manual/multiboot/multiboot.html where reads: printf (" size = 0x%x, base_addr = 0x%x%x," " length = 0x%x%x, type = 0x%x\n", (unsigned) mmap->size, mmap->addr >> 32, mmap->addr & 0xffffffff, mmap->len >> 32, mmap->len & 0xffffffff, (unsigned) mmap->type); should read: printf (" size = 0x%x, base_addr = 0x%x%x," " length = 0x%x%x, type = 0x%x\n", (unsigned) mmap->size, (unsigned)(mmap->addr >> 32), (unsigned)(mmap->addr & 0xffffffff), (unsigned)(mmap->len >> 32), (unsigned)(mmap->len & 0xffffffff), (unsigned) mmap->type); Since arguments are pushed to the stack to printf, we should cast 64 bit values to 32 bit ones, as long as the implementation of printf only handles 32 bit arguments. Otherwise the printed values are incorrect, even when they fit in 32 bits. Moreover, if the values do not fit in 32 bits, the printed values may be incorrect, since there is no 0-padding for the low half of both addr and len. _______________________________________________ Bug-grub mailing list Bug-grub@gnu.org https://lists.gnu.org/mailman/listinfo/bug-grub