My goal is to let my own kernel start an application cpu. It uses the same mechanism as the linux kernel:
- Send asserting and level triggered init-IPI
- Wait...
- Send deasserting and level triggered init-IPI
- Wait...
- Send up to two startup-IPIs with vector number (0x40000 >> 12)(the entry code for the application processor lies there)
Currently I'm just interested in making it work with QEMU. Unfortunately, instead of jumping to 0x40000, the application cpu jumps to 0x0 with the cs register set to 0x4000. (I checked with gdb).
The Intel MultiProcessor Specification (B.4.2) explains that the behavior that I noticed is valid if the target processor is halted immediately after RESET or INIT. But shouldn't this also apply to the code of the linux kernel? It sends the startup-IPI after the init-IPI. Or do I misunderstand the specification?
What can I do to have the application processor jump to 0x000VV000 and not to 0x0 with the cs register set to 0xVV00? I really can't see, where linux does something that changes the behavior.
