On Mon, 2009-06-22 at 22:52 +0200, Robert Millan wrote: > On Mon, Jun 22, 2009 at 03:39:03PM -0400, Pavel Roskin wrote: > > On Mon, 2009-06-22 at 11:52 +0200, Robert Millan wrote: > > > > Since %cs is pointing to the code, it should be possible to point it to > > > > gdtdesc. They should be nearby. > > > > > > It is nearby, but the address reference for `gdtdesc' is absolute, NOT > > > relative to %cs. Of course, when %cs is 0 that's no problem. But in my > > > case I can't set %cs to 0 because my code is above 0x10000. > > > > I think we can remove ADDR32 from the command. I tried that on i386-pc > > and it works in qemu and on real hardware. I don't see any need to use > > a 32-bit address in the lgdt command. > > This won't build. I don't think it's possible to use relative addresses > with this particular instruction. "DATA32 lgdt %cs:gdtdesc" results in: > > boot_img-boot_i386_qemu_boot.o: In function `real_to_prot': > (.text+0x64): relocation truncated to fit: R_386_16 against `.text'
My bad, I only checked it for i386-pc. I see this error for ieee1275-i386. I believe it happens because we relocate the output too high in memory, so we cannot relocate a 16-bit address there. > What's the problem with removing %cs? It's presence there is bogus. It > *seems* to indicate gdtdesc is a segment-relative reference, but in fact > it's not, and it just happens to work because %cs was set to 0. I just wanted to make sure we are not doing anything wrong. I have a feeling that somebody with a good knowledge of assembler tricks could write the code to use %cs and a 16-bit address, but I don't know how to do it. Anyway, your code is correct and I have no objections. Please commit. -- Regards, Pavel Roskin _______________________________________________ Grub-devel mailing list Grub-devel@gnu.org http://lists.gnu.org/mailman/listinfo/grub-devel