x86 assembly questions

Emmanuel Dreyfus <[email protected]>
Newsgroups gmane.os.netbsd.ports.i386
Message-ID <[email protected]>
Hello

I am working on multiboot 2 support in the NetBSD kernel, and I experience
a few problems with EFI bootstrap.

In EFI, the kernel is loaded at 0x4078000, while the code in i386 locore.S 
assumes it is at 0x100000. For that reason, native bootstrap startprog32 in
src/sys/arch/i386/stand/efiboot/bootia32/startprog32.S  copies the kernel
from the loaded address to 0x100000.

We cannot assume a multiboot 2 compliant loader will do that for us. Hence
I introduced an EFI32 entry point in locore.S and adapted the code
from startprog32 to copy the kernel in locore.S. The kernel copy is done
by a rep movsl instruction:
   x0x40780b1       rep movsl %ds:(%esi),%es:(%edi) 

At that time, I have:
%esi 0x4078000
%ds       0x10
%edi  0x100000
%es       0x10
%ecx  0x4ef400

First question: how %ds and %es are used here? They are supposed to 
determine the higher bits of addresses used by rep movsl, but if I 
step in rep mosvl, I can see the copy is indeed done from 0x4078000
to 0x100000, just like if %ds and %es were ignored or set to zero.

Then %ecx should contains the size in sizeof(long). I understand it 
should copy from 0x100000 to 0x100000 + (4 * 0x4ef400), which is 
0x14bd000, but when I break after rep movsl instruction, the code 
at 0x40780b3 has been clobered. This suggests the copy went too 
far and I did not correctly understood how rep movsl works. Where is
my error?

Last question: modifying %ss raises an exception. Why?

-- 
Emmanuel Dreyfus
[email protected]
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.