Bonsoir,
Inspiré du tutoriel de Mickael Chourdakis, j'essaie de résoudre un problème qui me fais taper sur le mur depuis toute la soirée.
Après avoir chargé la GDT/IDT, l'A20, etc... J'arrive à trouver mon LocalAPIC à l'adresse 0xFEC00000 ou 0xFEE00000. Jusqu'à là, tout vas bien!
Mais je n'arrive pas à trouver la table APIC!!! Je comprend pas !! (pc:Sony Vaio VPCEJ)
A la fin de mon code ci-dessous, la condition "cmp edx, 0" edx est toujours égale à zéro! J'ai testé sur un autre PC (Lenovo B590) pour être sur mais c'est pareil...
Si quelqu'un peut m'éclairer avant que je fasses connaissance de mon voisin
Si vous voulez les sous-programmes, dîtes le moi je suis fatigué j'ai du zaper pleins de choses
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145 ; Debut de la guerre cli mov ax,DATA16 mov ds,ax mov ax,STACK16 mov ss,ax mov sp,stack16_end sti ; Sauvegarder l'IDT sidt fword [ds:RealIDT] ; Sauvegarder la PSP mov ax,es mov [cs:OrgPSP],ax ; Configurer la GDT call CODE16:IDTInitF call CODE16:IDTInit64f ; Activer l'A20 push cs call EnableA20 ; Mode Unreal CLI call FAR CODE16:EnterUnreal STI ; Configurer les interruptions push cs call SetupInterrupts ; Preparer l'ACPI push cs call GetMyApic16f mov [ds:MainCPUAPIC],bl push cs call FillACPI mov eax,'APIC' push cs call FindACPITable ; ============================================================ ; ============================================================ ; **************** Fonction GetMyApic16f **************** GetMyApic16f: push eax push ecx push edx mov eax,1 cpuid and ebx,0xff000000 shr ebx,24 pop edx pop ecx pop eax retf ; **************** Fonction FillACPI *************** FillACPI: PUSHAD push es mov es,[fs:040eh] xor edi,edi mov di,[es:0] pop es mov edi, 0x000E0000 ; Rechercher l'apic... .s: cmp edi, 0x000FFFFF jge .APICNONTrouve mov eax,[fs:edi] add edi,4 mov edx,[fs:edi] add edi,4 cmp eax,0x20445352 jnz .s cmp edx,0x20525450 jnz .s jmp .APICTrouve ; Si on trouve pas l'APIC .APICNONTrouve: POPAD RETF ; Si l'APIC est trouve (EDI) .APICTrouve: sub edi,8 mov esi,edi ; 36 bytes for ACPI 2 mov ecx,36 push cs call ChecksumValid cmp eax,1 jnz .APICNONTrouve mov eax,[fs:edi + 24] mov dword [ds:XsdtAddress],eax mov eax,[fs:edi + 28] mov dword [ds:XsdtAddress + 4],eax mov edi,dword [ds:XsdtAddress] mov eax,[fs:edi] cmp eax, 'XSDT' ; Valid? jnz .APICNONTrouve POPAD ; APIC trouve! ICI CA MARCHE !!!! RETF ; **************** Fonction FindACPITable **************** FindACPITable: ; On recherche la Table APIC push edi push ebx push edx mov edi,dword [ds:XsdtAddress] .l1: mov ebx,[fs:edi] mov edx,[fs:edi + 4] cmp edx,0 jnz .TableTrouve ; Table non trouve... :( PROBLEME ICI !!!!!!!!!!!!!! ; Table trouve! .TableTrouve ; ... ; ...
Cordialement
Bonne soirée
Partager