Autor Thema: x86 SMP  (Gelesen 12787 mal)

FlashBurn

  • Beiträge: 844
    • Profil anzeigen
Gespeichert
« Antwort #20 am: 29. January 2011, 18:31 »
Ich bin mir jetzt nicht sicher was du meinst, aber wenn du meinst wie ich die Adresse in den Trampolin Code bekomme wo der AP dann hinspringen soll?

Ich übergeben dem AP solche Sachen wie GDT, IDT, CR3 usw. über eine festgelegte Speicheradresse und da speichere ich auch die Adresse wo der AP dann hinspringen soll.

In etwa sowas:
struct smpInitStruc_t {
 struct gdtr_t *gdtr;
 struct idtr_t *idtr;
 uint32t cr3;
 void *jumpPoint;
};

Das wird an eine feste Adresse gespeichert und beim Trampolin Code habe ich dann sowas:
mov edx,[FESTE_ADRESSE + 12]
;den ganzen kram um gdt und idt zu laden und in den pmode zu springen
...
;jetzt ist man schon im pmode und hat die segment register initialisiert
jmp [edx]

Hoffe das hilft dir weiter.

rizor

  • Beiträge: 521
    • Profil anzeigen
Gespeichert
« Antwort #21 am: 29. January 2011, 18:35 »
Ja, sowas in der Art meinte ich, danke.
Programmiertechnik:
Vermeide in Assembler zu programmieren wann immer es geht.

rizor

  • Beiträge: 521
    • Profil anzeigen
Gespeichert
« Antwort #22 am: 02. February 2011, 13:24 »
Ich habe bei dem Bootstrap-code leider zwei Probleme.
Das eine betrifft Bochs/Grub.
Der Loader gibt den Fehler 7 aus. Er verbietet es, dass Daten unterhalb der 1 MB Grenze abgelegt werden. Das verstehe ich aber nicht, da der ELF-Header erst alles ab der 1-MB Grenze haben möchte. Der Bootstrap-Code liegt auch innerhalb der Grenze.
Der andere Fehler ist, dass QEMU für die APs eine Bounded Range Exception.

Hier mein Assembler-Code:
.code16

/*
 * layout of the structure:
 *    1. GDT
 *    2. IDT
 *    3. stack-pointer (virtual, if CONFIG_MMU is set, else physical)
 *    4. Page-Table (if CONFIG_MMU exists, else the entry does not exist)
 *    5. the smp_ap_init-code (C-code) (it is the fourth entry, if !CONFIG_MMU)
 */

.section .text

start_up:
    cli
    lea (smp_init_end) , %ax
    lgdtl (%eax)

xor %ax , %ax
inc %ax
lmsw %ax
    ljmp $0x0000 , $code_32

.code32
code_32:
    mov $0x10 , %eax
    mov %eax , %ds
mov %eax , %es
mov %eax , %fs
mov %eax , %gs
mov %eax , %ss
    lea (smp_init_end) , %eax
    add $0x4 , %eax
    //set the IDT
    lidtl (%eax)
    add $0x4 , %eax
    lea (%eax) , %esp
    add $0x4 , %eax
#if defined(CONFIG_MMU)
    //activate paging
    lea (%eax) , %ebx
    mov %ebx , %cr3
    mov %cr0 , %ebx
    or $0x80010000 , %eax
    mov %ebx , %cr0
    add $0x4 , %eax
#endif
    lea (%eax) , %eax
    //call the C-code
    jmp *%eax

smp_init_end:

Übersehe ich etwas?
Programmiertechnik:
Vermeide in Assembler zu programmieren wann immer es geht.

FlashBurn

  • Beiträge: 844
    • Profil anzeigen
Gespeichert
« Antwort #23 am: 02. February 2011, 13:51 »
Wieder die selbe Frage bis wohin kommt er denn? Am sinnvollsten wäre es eine Endlosschleife direkt nach dem cli zu packen und wenn das nicht hilft dann muss du wieder guck geht es mit und ohne den Code und liegt der Fehler vllt schon vor dem Code.

rizor

  • Beiträge: 521
    • Profil anzeigen
Gespeichert
« Antwort #24 am: 02. February 2011, 15:33 »
Es funktioniert definitiv ohne den Code, das habe ich schon probiert.
Ich habe ein Problem mit der Endlosschleife nach cli.
Einer der Prozessoren löst einen Page-Fault aus (kann an sich ja nur der BSP sein).
Das verstehe ich aber nicht, da der Pagefault erst ausgelöst wird, sobald alles gemappt wurde, da der BSP da auf die anderen CPUs wartet.
Es ist eine Adresse die definitiv gemappt ist. Was mich wundert ist, dass der EIP direkt in einen String zeigt. Woran kann es liegen?
Habe mir mal die Qemu-Monitor-Ausgaben angeschaut, und das ganze durch den GDB laufen lassen.
Der BSP wartet auf einen atomaren Counter, der angibt welche CPUs schon laufen.
Auf einmal meldet sich der GDB, dass er wieder die Funktion anspringt, die die anderen CPUs startet.
Das ist laut GDB CPU0 und CPU1 liegt jenseits meines Codes. Der scheint einfach durch den ganzen Speicher zu laufen.
Programmiertechnik:
Vermeide in Assembler zu programmieren wann immer es geht.

FlashBurn

  • Beiträge: 844
    • Profil anzeigen
Gespeichert
« Antwort #25 am: 02. February 2011, 15:36 »
Wie startest du einen AP (also den Code) und wie mappst bzw. kopierst du den Trampolin-Code an die richtige Stelle?

rizor

  • Beiträge: 521
    • Profil anzeigen
Gespeichert
« Antwort #26 am: 02. February 2011, 15:40 »
Ich reserviere mir Adresse 0x7000 für den bootstrap-Code und mappe ihn mir.
Dann kenne ich noch die Adresse des Codes im Kernel-Image und kopiere ihn einfach an die gemappte Adresse. Direkt hinter den Code lege ich mir ein Struct mit den wichtigsten Informationen.

Der Code, der die CPUs hoch holt, ist etwas geschummelt, da mein Kernel noch keine Zeiten bestimmen kann (kommt noch).

/*
 * code for the APs to start the other processors
 */
void __init smp_ap_init()
{
    mutex_atomic_inc(&cpu_count , 1);

#if CONFIG_BOOT_MSG_LVL >= 1
kprintf(smp_init_cpu_active , smp_get_cpu_id());
#endif

while(1);
}

inline void __init smp_send_ipi(uint32_t cpu_id , uint8_t vec , uint32_t deliver , bool assert , bool triggered)
{
    volatile void* apic_addr;

#if defined(CONFIG_MMU)
apic_addr = mapped_apic;
#else
msr = 0x1b;
asm volatile("rdmsr" : "=a"(low) , "=d"(high) : "c"(msr));

apic_addr = (low & 0xFFFFF000);
apic_id = (*((uint32_t*)apic_id_addr)) >> 23;
#endif

while(*((uint32_t*)(apic_addr + 0x300)) & 0x1000);

*((uint32_t*)(apic_addr + 0x310)) = cpu_id << 24;
*((uint32_t*)(apic_addr + 0x300)) = vec | (deliver << 8) | (assert ? 1 << 14 : 0) | (triggered ? 1 << 15 : 0);
}

/*
 * start a specified AP
 */
void __init smp_start_ap(uint32_t cpu_id)
{
    uint32_t i;

    /* call delivery mode init */
    smp_send_ipi(cpu_id , 0 , 5 , true , true);
smp_send_ipi(cpu_id , 0 , 5 , false , true);

/* FIXME: use correct time-stamps after the implementation*/
for(i = 0; i < 1000000; i++);

/* send the startuo IPI */
smp_send_ipi(cpu_id , 0x07 , 6 , true , false);
}
Programmiertechnik:
Vermeide in Assembler zu programmieren wann immer es geht.

FlashBurn

  • Beiträge: 844
    • Profil anzeigen
Gespeichert
« Antwort #27 am: 02. February 2011, 15:55 »
Also auf die schnelle kann ich dir nur sagen, das mir dein Trampolin-Code überhaupt nicht gefällt ;)

Du initialisierst kein DS-Segment, dann bin ich mir nicht sicher ob das was du mit ax machst wirklich seinen Zweck erfüllt (du willst das PMode-Bit setzen) und was ist deine "Basis-Adresse" (damit meine ich wird beim assemblieren/linken angenommen das der Code an der Adresse 0 oder an der Adresse 0x7000 ausgeführt wird).
Zeig doch mal dein Bochs-Log, es reicht erstmal die ganzen CPU-Register.

rizor

  • Beiträge: 521
    • Profil anzeigen
Gespeichert
« Antwort #28 am: 02. February 2011, 16:03 »
Der Linker legt den Code auf 0x7000.

Hier mal mein Qemu-Log:

CPU Reset (CPU 0)
EAX=00000000 EBX=00000000 ECX=00000000 EDX=00000000
ESI=00000000 EDI=00000000 EBP=00000000 ESP=00000000
EIP=00000000 EFL=00000000 [-------] CPL=0 II=0 A20=0 SMM=0 HLT=0
ES =0000 00000000 00000000 00000000
CS =0000 00000000 00000000 00000000
SS =0000 00000000 00000000 00000000
DS =0000 00000000 00000000 00000000
FS =0000 00000000 00000000 00000000
GS =0000 00000000 00000000 00000000
LDT=0000 00000000 00000000 00000000
TR =0000 00000000 00000000 00000000
GDT=     00000000 00000000
IDT=     00000000 00000000
CR0=00000000 CR2=00000000 CR3=00000000 CR4=00000000
DR0=00000000 DR1=00000000 DR2=00000000 DR3=00000000
DR6=00000000 DR7=00000000
CCS=00000000 CCD=00000000 CCO=DYNAMIC
FCW=0000 FSW=0000 [ST=0] FTW=ff MXCSR=00000000
FPR0=0000000000000000 0000 FPR1=0000000000000000 0000
FPR2=0000000000000000 0000 FPR3=0000000000000000 0000
FPR4=0000000000000000 0000 FPR5=0000000000000000 0000
FPR6=0000000000000000 0000 FPR7=0000000000000000 0000
XMM00=00000000000000000000000000000000 XMM01=00000000000000000000000000000000
XMM02=00000000000000000000000000000000 XMM03=00000000000000000000000000000000
XMM04=00000000000000000000000000000000 XMM05=00000000000000000000000000000000
XMM06=00000000000000000000000000000000 XMM07=00000000000000000000000000000000
CPU Reset (CPU 0)
EAX=00000000 EBX=00000000 ECX=00000000 EDX=00000633
ESI=00000000 EDI=00000000 EBP=00000000 ESP=00000000
EIP=0000fff0 EFL=00000002 [-------] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =0000 00000000 0000ffff 00009300
CS =f000 ffff0000 0000ffff 00009b00
SS =0000 00000000 0000ffff 00009300
DS =0000 00000000 0000ffff 00009300
FS =0000 00000000 0000ffff 00009300
GS =0000 00000000 0000ffff 00009300
LDT=0000 00000000 0000ffff 00008200
TR =0000 00000000 0000ffff 00008b00
GDT=     00000000 0000ffff
IDT=     00000000 0000ffff
CR0=60000010 CR2=00000000 CR3=00000000 CR4=00000000
DR0=00000000 DR1=00000000 DR2=00000000 DR3=00000000
DR6=ffff0ff0 DR7=00000400
CCS=00000000 CCD=00000000 CCO=DYNAMIC
FCW=037f FSW=0000 [ST=0] FTW=00 MXCSR=00001f80
FPR0=0000000000000000 0000 FPR1=0000000000000000 0000
FPR2=0000000000000000 0000 FPR3=0000000000000000 0000
FPR4=0000000000000000 0000 FPR5=0000000000000000 0000
FPR6=0000000000000000 0000 FPR7=0000000000000000 0000
XMM00=00000000000000000000000000000000 XMM01=00000000000000000000000000000000
XMM02=00000000000000000000000000000000 XMM03=00000000000000000000000000000000
XMM04=00000000000000000000000000000000 XMM05=00000000000000000000000000000000
XMM06=00000000000000000000000000000000 XMM07=00000000000000000000000000000000
CPU Reset (CPU 1)
EAX=00000000 EBX=00000000 ECX=00000000 EDX=00000000
ESI=00000000 EDI=00000000 EBP=00000000 ESP=00000000
EIP=00000000 EFL=00000000 [-------] CPL=0 II=0 A20=0 SMM=0 HLT=0
ES =0000 00000000 00000000 00000000
CS =0000 00000000 00000000 00000000
SS =0000 00000000 00000000 00000000
DS =0000 00000000 00000000 00000000
FS =0000 00000000 00000000 00000000
GS =0000 00000000 00000000 00000000
LDT=0000 00000000 00000000 00000000
TR =0000 00000000 00000000 00000000
GDT=     00000000 00000000
IDT=     00000000 00000000
CR0=00000000 CR2=00000000 CR3=00000000 CR4=00000000
DR0=00000000 DR1=00000000 DR2=00000000 DR3=00000000
DR6=00000000 DR7=00000000
CCS=00000000 CCD=00000000 CCO=DYNAMIC
FCW=0000 FSW=0000 [ST=0] FTW=ff MXCSR=00000000
FPR0=0000000000000000 0000 FPR1=0000000000000000 0000
FPR2=0000000000000000 0000 FPR3=0000000000000000 0000
FPR4=0000000000000000 0000 FPR5=0000000000000000 0000
FPR6=0000000000000000 0000 FPR7=0000000000000000 0000
XMM00=00000000000000000000000000000000 XMM01=00000000000000000000000000000000
XMM02=00000000000000000000000000000000 XMM03=00000000000000000000000000000000
XMM04=00000000000000000000000000000000 XMM05=00000000000000000000000000000000
XMM06=00000000000000000000000000000000 XMM07=00000000000000000000000000000000
CPU Reset (CPU 1)
EAX=00000000 EBX=00000000 ECX=00000000 EDX=00000633
ESI=00000000 EDI=00000000 EBP=00000000 ESP=00000000
EIP=0000fff0 EFL=00000002 [-------] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =0000 00000000 0000ffff 00009300
CS =f000 ffff0000 0000ffff 00009b00
SS =0000 00000000 0000ffff 00009300
DS =0000 00000000 0000ffff 00009300
FS =0000 00000000 0000ffff 00009300
GS =0000 00000000 0000ffff 00009300
LDT=0000 00000000 0000ffff 00008200
TR =0000 00000000 0000ffff 00008b00
GDT=     00000000 0000ffff
IDT=     00000000 0000ffff
CR0=60000010 CR2=00000000 CR3=00000000 CR4=00000000
DR0=00000000 DR1=00000000 DR2=00000000 DR3=00000000
DR6=ffff0ff0 DR7=00000400
CCS=00000000 CCD=00000000 CCO=DYNAMIC
FCW=037f FSW=0000 [ST=0] FTW=00 MXCSR=00001f80
FPR0=0000000000000000 0000 FPR1=0000000000000000 0000
FPR2=0000000000000000 0000 FPR3=0000000000000000 0000
FPR4=0000000000000000 0000 FPR5=0000000000000000 0000
FPR6=0000000000000000 0000 FPR7=0000000000000000 0000
XMM00=00000000000000000000000000000000 XMM01=00000000000000000000000000000000
XMM02=00000000000000000000000000000000 XMM03=00000000000000000000000000000000
XMM04=00000000000000000000000000000000 XMM05=00000000000000000000000000000000
XMM06=00000000000000000000000000000000 XMM07=00000000000000000000000000000000
CPU Reset (CPU 1)
EAX=00000000 EBX=00000000 ECX=00000000 EDX=00000633
ESI=00000000 EDI=00000000 EBP=00000000 ESP=00000000
EIP=0000fff0 EFL=00000002 [-------] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =0000 00000000 0000ffff 00009300
CS =f000 ffff0000 0000ffff 00009b00
SS =0000 00000000 0000ffff 00009300
DS =0000 00000000 0000ffff 00009300
FS =0000 00000000 0000ffff 00009300
GS =0000 00000000 0000ffff 00009300
LDT=0000 00000000 0000ffff 00008200
TR =0000 00000000 0000ffff 00008b00
GDT=     00000000 0000ffff
IDT=     00000000 0000ffff
CR0=60000010 CR2=00000000 CR3=00000000 CR4=00000000
DR0=00000000 DR1=00000000 DR2=00000000 DR3=00000000
DR6=ffff0ff0 DR7=00000400
CCS=00000000 CCD=00000000 CCO=EFLAGS 
FCW=037f FSW=0000 [ST=0] FTW=00 MXCSR=00001f80
FPR0=0000000000000000 0000 FPR1=0000000000000000 0000
FPR2=0000000000000000 0000 FPR3=0000000000000000 0000
FPR4=0000000000000000 0000 FPR5=0000000000000000 0000
FPR6=0000000000000000 0000 FPR7=0000000000000000 0000
XMM00=00000000000000000000000000000000 XMM01=00000000000000000000000000000000
XMM02=00000000000000000000000000000000 XMM03=00000000000000000000000000000000
XMM04=00000000000000000000000000000000 XMM05=00000000000000000000000000000000
XMM06=00000000000000000000000000000000 XMM07=00000000000000000000000000000000
SMM: enter
EAX=00000001 EBX=80000070 ECX=00000cf8 EDX=000000b3
ESI=02000000 EDI=0009fb8c EBP=0009fb24 ESP=0009fb14
EIP=000e0aa0 EFL=00000002 [-------] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =0018 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
CS =0010 00000000 ffffffff 00cf9b00 DPL=0 CS32 [-RA]
SS =0018 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
DS =0018 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
FS =0000 00000000 00000000 00000000
GS =0000 00000000 00000000 00000000
LDT=0000 00000000 0000ffff 00008200 DPL=0 LDT
TR =0000 00000000 0000ffff 00008b00 DPL=0 TSS32-busy
GDT=     000fb867 00000030
IDT=     000f0000 00000000
CR0=60000011 CR2=00000000 CR3=00000000 CR4=00000000
DR0=00000000 DR1=00000000 DR2=00000000 DR3=00000000
DR6=ffff0ff0 DR7=00000400
CCS=0000002d CCD=00000001 CCO=LOGICB 
SMM: after RSM
EAX=00000001 EBX=80000070 ECX=00000cf8 EDX=000000b3
ESI=02000000 EDI=0009fb8c EBP=0009fb24 ESP=0009fb14
EIP=000e0aa0 EFL=00000002 [-------] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =0018 00000000 ffffffff 00c09300 DPL=0 DS   [-WA]
CS =0010 00000000 ffffffff 00c09b00 DPL=0 CS32 [-RA]
SS =0018 00000000 ffffffff 00c09300 DPL=0 DS   [-WA]
DS =0018 00000000 ffffffff 00c09300 DPL=0 DS   [-WA]
FS =0000 00000000 00000000 00000000
GS =0000 00000000 00000000 00000000
LDT=0000 00000000 0000ffff 00008200 DPL=0 LDT
TR =0000 00000000 0000ffff 00008b00 DPL=0 TSS32-busy
GDT=     000fb867 00000030
IDT=     000f0000 00000000
CR0=60000011 CR2=00000000 CR3=00000000 CR4=00000000
DR0=00000000 DR1=00000000 DR2=00000000 DR3=00000000
DR6=ffff0ff0 DR7=00000400
CCS=00000000 CCD=ffffff9c CCO=EFLAGS 
CPU Reset (CPU 1)
EAX=00000000 EBX=00000510 ECX=00000000 EDX=00000633
ESI=00000000 EDI=00000000 EBP=00000000 ESP=00000000
EIP=0000002c EFL=00000002 [-------] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =0000 00000000 0000ffff 00009300
CS =9f00 0009f000 0000ffff 00000000
SS =0000 00000000 0000ffff 00009300
DS =0000 00000000 0000ffff 00009300
FS =0000 00000000 0000ffff 00009300
GS =0000 00000000 0000ffff 00009300
LDT=0000 00000000 0000ffff 00008200
TR =0000 00000000 0000ffff 00008b00
GDT=     00000000 0000ffff
IDT=     00000000 0000ffff
CR0=60000010 CR2=00000000 CR3=00000000 CR4=00000000
DR0=00000000 DR1=00000000 DR2=00000000 DR3=00000000
DR6=ffff0ff0 DR7=00000400
CCS=00000000 CCD=00000002 CCO=EFLAGS 
FCW=037f FSW=0000 [ST=0] FTW=00 MXCSR=00001f80
FPR0=0000000000000000 0000 FPR1=0000000000000000 0000
FPR2=0000000000000000 0000 FPR3=0000000000000000 0000
FPR4=0000000000000000 0000 FPR5=0000000000000000 0000
FPR6=0000000000000000 0000 FPR7=0000000000000000 0000
XMM00=00000000000000000000000000000000 XMM01=00000000000000000000000000000000
XMM02=00000000000000000000000000000000 XMM03=00000000000000000000000000000000
XMM04=00000000000000000000000000000000 XMM05=00000000000000000000000000000000
XMM06=00000000000000000000000000000000 XMM07=00000000000000000000000000000000
check_exception old: 0xffffffff new 0xe
     0: v=0e e=0003 i=0 cpl=0 IP=0008:00104ac7 pc=00104ac7 SP=0010:0010e000 CR2=0010dffc
EAX=00000001 EBX=000005b4 ECX=00004607 EDX=00000002
ESI=000e0000 EDI=0000007c EBP=00113ab8 ESP=0010e000
EIP=00104ac7 EFL=00000002 [-------] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
CS =0008 00000000 ffffffff 00cf9a00 DPL=0 CS32 [-R-]
SS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
DS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
FS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
GS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
LDT=0000 00000000 0000ffff 00008200 DPL=0 LDT
TR =0000 00000000 0000ffff 00008b00 DPL=0 TSS32-busy
GDT=     0010fa00 0000002f
IDT=     0010f1c0 000007ff
CR0=80010011 CR2=0010dffc CR3=01000000 CR4=00000000
DR0=00000000 DR1=00000000 DR2=00000000 DR3=00000000
DR6=ffff0ff0 DR7=00000400
CCS=00000095 CCD=ffffffff CCO=EFLAGS 
check_exception old: 0xe new 0xb
     1: v=08 e=0000 i=0 cpl=0 IP=0008:00104ac7 pc=00104ac7 SP=0010:0010e000 EAX=00000001
EAX=00000001 EBX=000005b4 ECX=00004607 EDX=00000002
ESI=000e0000 EDI=0000007c EBP=00113ab8 ESP=0010e000
EIP=00104ac7 EFL=00000002 [-------] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
CS =0008 00000000 ffffffff 00cf9a00 DPL=0 CS32 [-R-]
SS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
DS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
FS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
GS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
LDT=0000 00000000 0000ffff 00008200 DPL=0 LDT
TR =0000 00000000 0000ffff 00008b00 DPL=0 TSS32-busy
GDT=     0010fa00 0000002f
IDT=     0010f1c0 000007ff
CR0=80010011 CR2=0010dffc CR3=01000000 CR4=00000000
DR0=00000000 DR1=00000000 DR2=00000000 DR3=00000000
DR6=ffff0ff0 DR7=00000400
CCS=00000095 CCD=ffffffff CCO=EFLAGS 
check_exception old: 0x8 new 0xb
Triple fault
CPU Reset (CPU 0)
EAX=00000001 EBX=000005b4 ECX=00004607 EDX=00000002
ESI=000e0000 EDI=0000007c EBP=00113ab8 ESP=0010e000
EIP=00104ac7 EFL=00000097 [--S-APC] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
CS =0008 00000000 ffffffff 00cf9a00 DPL=0 CS32 [-R-]
SS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
DS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
FS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
GS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
LDT=0000 00000000 0000ffff 00008200 DPL=0 LDT
TR =0000 00000000 0000ffff 00008b00 DPL=0 TSS32-busy
GDT=     0010fa00 0000002f
IDT=     0010f1c0 000007ff
CR0=80010011 CR2=0010dffc CR3=01000000 CR4=00000000
DR0=00000000 DR1=00000000 DR2=00000000 DR3=00000000
DR6=ffff0ff0 DR7=00000400
CCS=00000095 CCD=ffffffff CCO=EFLAGS 
FCW=037f FSW=0000 [ST=0] FTW=00 MXCSR=00001f80
FPR0=0000000000000000 0000 FPR1=0000000000000000 0000
FPR2=0000000000000000 0000 FPR3=0000000000000000 0000
FPR4=0000000000000000 0000 FPR5=0000000000000000 0000
FPR6=0000000000000000 0000 FPR7=0000000000000000 0000
XMM00=00000000000000000000000000000000 XMM01=00000000000000000000000000000000
XMM02=00000000000000000000000000000000 XMM03=00000000000000000000000000000000
XMM04=00000000000000000000000000000000 XMM05=00000000000000000000000000000000
XMM06=00000000000000000000000000000000 XMM07=00000000000000000000000000000000
CPU Reset (CPU 1)
EAX=0000ffff EBX=60000010 ECX=00000000 EDX=00000633
ESI=00000000 EDI=00000000 EBP=0000ff53 ESP=00000014
EIP=00026c9e EFL=00000093 [--S-A-C] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =0008 00000080 0000ffff 00009300
CS =0700 00007000 0000ffff 00000000
SS =0008 00000080 0000ffff 00009300
DS =0008 00000080 0000ffff 00009300
FS =0008 00000080 0000ffff 00009300
GS =0008 00000080 0000ffff 00009300
LDT=0000 00000000 0000ffff 00008200
TR =0000 00000000 0000ffff 00008b00
GDT=     00000000 0000ffff
IDT=     0053f000 0000ff53
CR0=60000010 CR2=00000000 CR3=60000010 CR4=00000000
DR0=00000000 DR1=00000000 DR2=00000000 DR3=00000000
DR6=ffff0ff0 DR7=00000400
CCS=0000ffff CCD=000100c8 CCO=ADDB   
FCW=037f FSW=0000 [ST=0] FTW=00 MXCSR=00001f80
FPR0=0000000000000000 0000 FPR1=0000000000000000 0000
FPR2=0000000000000000 0000 FPR3=0000000000000000 0000
FPR4=0000000000000000 0000 FPR5=0000000000000000 0000
FPR6=0000000000000000 0000 FPR7=0000000000000000 0000
XMM00=00000000000000000000000000000000 XMM01=00000000000000000000000000000000
XMM02=00000000000000000000000000000000 XMM03=00000000000000000000000000000000
XMM04=00000000000000000000000000000000 XMM05=00000000000000000000000000000000
XMM06=00000000000000000000000000000000 XMM07=00000000000000000000000000000000
CPU Reset (CPU 1)
EAX=00000000 EBX=00000000 ECX=00000000 EDX=00000633
ESI=00000000 EDI=00000000 EBP=00000000 ESP=00000000
EIP=0000fff0 EFL=00000002 [-------] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =0000 00000000 0000ffff 00009300
CS =f000 ffff0000 0000ffff 00009b00
SS =0000 00000000 0000ffff 00009300
DS =0000 00000000 0000ffff 00009300
FS =0000 00000000 0000ffff 00009300
GS =0000 00000000 0000ffff 00009300
LDT=0000 00000000 0000ffff 00008200
TR =0000 00000000 0000ffff 00008b00
GDT=     00000000 0000ffff
IDT=     00000000 0000ffff
CR0=60000010 CR2=00000000 CR3=00000000 CR4=00000000
DR0=00000000 DR1=00000000 DR2=00000000 DR3=00000000
DR6=ffff0ff0 DR7=00000400
CCS=00000000 CCD=00000000 CCO=EFLAGS 
FCW=037f FSW=0000 [ST=0] FTW=00 MXCSR=00001f80
FPR0=0000000000000000 0000 FPR1=0000000000000000 0000
FPR2=0000000000000000 0000 FPR3=0000000000000000 0000
FPR4=0000000000000000 0000 FPR5=0000000000000000 0000
FPR6=0000000000000000 0000 FPR7=0000000000000000 0000
XMM00=00000000000000000000000000000000 XMM01=00000000000000000000000000000000
XMM02=00000000000000000000000000000000 XMM03=00000000000000000000000000000000
XMM04=00000000000000000000000000000000 XMM05=00000000000000000000000000000000
XMM06=00000000000000000000000000000000 XMM07=00000000000000000000000000000000
SMM: enter
EAX=00000001 EBX=80000070 ECX=00000cf8 EDX=000000b3
ESI=02000000 EDI=0009fb8c EBP=0009fb24 ESP=0009fb14
EIP=000e0aa0 EFL=00000002 [-------] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =0018 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
CS =0010 00000000 ffffffff 00cf9b00 DPL=0 CS32 [-RA]
SS =0018 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
DS =0018 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
FS =0000 00000000 00000000 00000000
GS =0000 00000000 00000000 00000000
LDT=0000 00000000 0000ffff 00008200 DPL=0 LDT
TR =0000 00000000 0000ffff 00008b00 DPL=0 TSS32-busy
GDT=     000fb867 00000030
IDT=     000f0000 00000000
CR0=60000011 CR2=00000000 CR3=00000000 CR4=00000000
DR0=00000000 DR1=00000000 DR2=00000000 DR3=00000000
DR6=ffff0ff0 DR7=00000400
CCS=0000002d CCD=00000001 CCO=LOGICB 
SMM: after RSM
EAX=00000001 EBX=80000070 ECX=00000cf8 EDX=000000b3
ESI=02000000 EDI=0009fb8c EBP=0009fb24 ESP=0009fb14
EIP=000e0aa0 EFL=00000002 [-------] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =0018 00000000 ffffffff 00c09300 DPL=0 DS   [-WA]
CS =0010 00000000 ffffffff 00c09b00 DPL=0 CS32 [-RA]
SS =0018 00000000 ffffffff 00c09300 DPL=0 DS   [-WA]
DS =0018 00000000 ffffffff 00c09300 DPL=0 DS   [-WA]
FS =0000 00000000 00000000 00000000
GS =0000 00000000 00000000 00000000
LDT=0000 00000000 0000ffff 00008200 DPL=0 LDT
TR =0000 00000000 0000ffff 00008b00 DPL=0 TSS32-busy
GDT=     000fb867 00000030
IDT=     000f0000 00000000
CR0=60000011 CR2=00000000 CR3=00000000 CR4=00000000
DR0=00000000 DR1=00000000 DR2=00000000 DR3=00000000
DR6=ffff0ff0 DR7=00000400
CCS=00000000 CCD=ffffff9c CCO=EFLAGS 
Programmiertechnik:
Vermeide in Assembler zu programmieren wann immer es geht.

FlashBurn

  • Beiträge: 844
    • Profil anzeigen
Gespeichert
« Antwort #29 am: 02. February 2011, 16:12 »
Ich kann leider mit dem Log nicht soviel anfangen, aber was ich gelesen habe, klingt nach einem Stack-Overflow, weil dein Stack-Pointer (ESP) bei 0x10e000 ist und in CR2 steht 0x10dffc.

Ansonsten finde ich kann man mit nem Bochs-Log mehr anfangen ;)

rizor

  • Beiträge: 521
    • Profil anzeigen
Gespeichert
« Antwort #30 am: 02. February 2011, 16:32 »
Bei Bochs habe ich nur leider das Problem, dass mir GRUB den Dienst verweigert.
Das mit dem Stack-Pointer kann ich mir an sich nicht erklären, da der Kernel an sich den Stack nicht aufbaut.
Programmiertechnik:
Vermeide in Assembler zu programmieren wann immer es geht.

FlashBurn

  • Beiträge: 844
    • Profil anzeigen
Gespeichert
« Antwort #31 am: 02. February 2011, 16:41 »
Pass auf, lass den BSP genau einen AP starten (also nur das Senden der IPI Nachricht), dann geht er in eine endlos Schleife und deinen Trampolin-Code modifizierst du so das er nach dem cli auch ne endlos Schleife macht. Wenn das schon nicht funktioniert liegt der Fehler entweder beim Mappen oder beim Senden der IPI-Nachricht.

Funktioniert das doch, setzt du die endlos Schleife von dem Trampolin-Code immer eine Instruktion weiter und guckst dir den Inhalt der Register an, sprich ob die den erwarteten Inhalt haben.

rizor

  • Beiträge: 521
    • Profil anzeigen
Gespeichert
« Antwort #32 am: 02. February 2011, 16:56 »
Der Code schmiert auch nach deinem Tipp ab. Auf den ersten Blick hat sich mein CPU-Dump auch nicht verändert.
Programmiertechnik:
Vermeide in Assembler zu programmieren wann immer es geht.

FlashBurn

  • Beiträge: 844
    • Profil anzeigen
Gespeichert
« Antwort #33 am: 02. February 2011, 17:06 »
Also ist ein Fehler beim Mapping sehr wahrscheinlich. Speichere doch mal mit Qemu deine Pagingtabellen in einer Datei ab und guck sie dir an bzw. guck dir die entsprechenden Stellen direkt in Qemu an, ob alles so ist wie es sein soll.

Ich gehe mal davon aus, dass wenn du eine endlos Schleife direkt vor dem Absenden der IPI Nachricht packst, alles ok ist?

rizor

  • Beiträge: 521
    • Profil anzeigen
Gespeichert
« Antwort #34 am: 02. February 2011, 17:20 »
Qemu meldet, dass die Adresse 0x7000 korrekt gemappt ist und der Kernel lesend und schreiben auf sie zugreifen kann.
Nein, die Endlosschleife kommt direkt nach dem SIPI und im Bootstrap-Code direkt nach dem CLI.
Mich wundert nur, dass der Kernel die Exceptions nicht abfängt, da die IDT korrekt gesetzt ist und ich das auch schon mal versucht habe.
Programmiertechnik:
Vermeide in Assembler zu programmieren wann immer es geht.

FlashBurn

  • Beiträge: 844
    • Profil anzeigen
Gespeichert
« Antwort #35 am: 02. February 2011, 17:27 »
Wenn der Stakc wirklich im Eimer ist, dann kann er die Exceptions nicht abfangen.

Einfach die endlos Schleife so lange nach "vorne" (also Funtion für Funktion "raus nehmen") versetzen bis es läuft, wenn du dann die Funktion hast musst du noch rausfinden wo es nicht hinaut.

Wie ist denn dein Startwert für ESP?

rizor

  • Beiträge: 521
    • Profil anzeigen
Gespeichert
« Antwort #36 am: 02. February 2011, 17:47 »
So, habe einiges festgestellt. Es ist der SIPI-Call, der das Problem auslöst. Nachdem die andere CPU gestartet wurde, springt der BSP direkt wieder nach smp_init und läuft sich wieder fest. Dadurch wird der Stack aufgebläht und macht alles im System kaputt, wodurch er dann auch keine Interrupts mehr behandeln kann.
Nun stellt sich mir die Frage, ob ich was vergessen habe.
Muss ich den LAPIC irgendwie initialisieren?
Ich verwende ihn jetzt einfach.
Programmiertechnik:
Vermeide in Assembler zu programmieren wann immer es geht.

FlashBurn

  • Beiträge: 844
    • Profil anzeigen
Gespeichert
« Antwort #37 am: 02. February 2011, 17:56 »
Ich sags mal so, wenn man den LAPIC initialisiert ist man auf der sicheren Seite, weil der kann ja einiges an Ints werfen und wäre doof wenn das passiert ohne das du gesagt hast wie die behandelt werden sollen (oder das sie ignoriert werden sollen).

 

Einloggen