Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
2293 | Serge | 1 | #include |
2 | #include |
||
3 | #include "acpi.h" |
||
4 | |||
5 | extern acpi_rsdp_t* acpi_rsdp; |
||
6 | extern acpi_rsdt_t* acpi_rsdt; |
||
7 | |||
8 | addr_t acpi_ioapic; |
||
9 | addr_t acpi_local_apic; |
||
10 | |||
11 | u8_t __fastcall acpi_table_checksum(u32_t length, u8_t *buffer); |
||
12 | |||
13 | u8_t __fastcall acpi_table_checksum(u32_t length, u8_t *buffer) |
||
14 | { |
||
15 | u8_t sum = 0; |
||
16 | u8_t *end = buffer + length; |
||
17 | |||
18 | while (buffer < end) |
||
19 | { |
||
20 | sum = (u8_t)(sum + *(buffer++)); |
||
21 | } |
||
22 | |||
23 | return sum; |
||
24 | }; |
||
25 | |||
26 | void* acpi_remap_table(addr_t table) |
||
27 | { |
||
28 | addr_t ptr; |
||
29 | |||
30 | if( (table >= acpi_rsdp->rsdt_ptr)&& |
||
31 | (table < acpi_rsdp->rsdt_ptr+0x10000)) |
||
32 | ptr = (table - acpi_rsdp->rsdt_ptr+(addr_t)acpi_rsdt); |
||
33 | return (void*)ptr; |
||
34 | }; |
||
35 | |||
36 | |||
37 | void print_rsdt(acpi_rsdt_t *rsdt) |
||
38 | { |
||
39 | u32_t i; |
||
40 | dbgprintf("ACPI RSD Table\n"); |
||
41 | for (i = 0; i < ((rsdt->header.len-sizeof(acpi_thead_t))/ |
||
42 | sizeof(rsdt->ptrs[0])); i++) |
||
43 | { |
||
44 | acpi_thead_t* t = (acpi_thead_t*)acpi_remap_table(rsdt->ptrs[i]); |
||
45 | char *p = (char*)&t->sig; |
||
46 | dbgprintf("sig %d: %c%c%c%c base %x\n", i, |
||
47 | p[0],p[1],p[2],p[3], t); |
||
48 | }; |
||
49 | }; |
||
50 | |||
51 | |||
52 | void print_madt (acpi_madt_t * madt) |
||
53 | { |
||
54 | u32_t i; |
||
55 | |||
56 | acpi_local_apic = madt->local_apic_addr; |
||
57 | |||
58 | dbgprintf ("Local APIC at 0x%x\n\n", acpi_local_apic); |
||
59 | |||
60 | for (i = 0; i < (madt->header.len - sizeof (acpi_madt_t));) |
||
61 | { |
||
62 | acpi_madt_hdr_t * h = (acpi_madt_hdr_t*) &madt->data[i]; |
||
63 | switch (h->type) |
||
64 | { |
||
65 | case 0: |
||
66 | { |
||
67 | // Local APIC |
||
68 | acpi_madt_lapic_t * lapic = (acpi_madt_lapic_t *) h; |
||
69 | dbgprintf ("Local APIC "); |
||
70 | dbgprintf ("[Id: 0x%x, CPU Id: 0x%x, %s]\n", |
||
71 | lapic->id, lapic->apic_processor_id, |
||
72 | lapic->flags.enabled ? "enabled" : "disabled"); |
||
73 | break; |
||
74 | } |
||
75 | case 1: |
||
76 | { |
||
77 | // I/O Apic |
||
78 | acpi_madt_ioapic_t * ioapic = (acpi_madt_ioapic_t *) h; |
||
79 | |||
80 | acpi_ioapic = ioapic->address; |
||
81 | |||
82 | dbgprintf ("I/O APIC "); |
||
83 | dbgprintf ("[Id: 0x%x, IRQ base: %d, Addr: 0x%x]\n", |
||
84 | ioapic->id, ioapic->irq_base, acpi_ioapic); |
||
85 | break; |
||
86 | } |
||
87 | case 2: |
||
88 | { |
||
89 | // Interrupt Source Override |
||
90 | acpi_madt_irq_t * irq = (acpi_madt_irq_t *) h; |
||
91 | polarity_t p = irq_get_polarity(irq); |
||
92 | trigger_mode_t t = irq_get_trigger_mode(irq); |
||
93 | |||
94 | dbgprintf ("Interrupt Override "); |
||
95 | dbgprintf ("[%s, Bus IRQ: %d, Glob IRQ: %d, Pol: %s, Trigger: %s]\n", |
||
96 | irq->src_bus == 0 ? "ISA" : "unknown bus", |
||
97 | irq->src_irq, irq->dest, |
||
98 | p == conform_polarity ? "conform" : |
||
99 | p == active_high ? "active high" : |
||
100 | p == active_low ? "active low" : "?", |
||
101 | t == conform_trigger ? "conform" : |
||
102 | t == edge ? "edge" : |
||
103 | t == level ? "level" : "?"); |
||
104 | break; |
||
105 | } |
||
106 | case 3: |
||
107 | { |
||
108 | // NMI Source |
||
109 | |||
110 | acpi_madt_nmi_t * nmi = (acpi_madt_nmi_t *) h; |
||
111 | polarity_t p = nmi_get_polarity(nmi); |
||
112 | trigger_mode_t t = nmi_get_trigger_mode(nmi); |
||
113 | dbgprintf ("NMI Source "); |
||
114 | dbgprintf ("[Glob IRQ: %d, Pol: %s, Trigger: %s]\n", |
||
115 | nmi->irq, |
||
116 | p == conform_polarity ? "conform" : |
||
117 | p == active_high ? "active high" : |
||
118 | p == active_low ? "active low" : "?", |
||
119 | t == conform_trigger ? "conform" : |
||
120 | t == edge ? "edge" : |
||
121 | t == level ? "level" : "?"); |
||
122 | |||
123 | break; |
||
124 | } |
||
125 | case 4: |
||
126 | { |
||
127 | // Local APIC NMI |
||
128 | acpi_lapic_nmi_t *nmi = (acpi_lapic_nmi_t *) h; |
||
129 | |||
130 | polarity_t p = lapic_nmi_get_polarity(nmi); |
||
131 | trigger_mode_t t = lapic_nmi_get_trigger_mode(nmi); |
||
132 | |||
133 | dbgprintf ("Local APIC NMI\n"); |
||
134 | |||
135 | dbgprintf ("[CPU id: %d, LINT#: %d Pol: %s, Trigger: %s]\n", |
||
136 | nmi->apic_processor_id, |
||
137 | nmi->lint, |
||
138 | p == conform_polarity ? "conform" : |
||
139 | p == active_high ? "active high" : |
||
140 | p == active_low ? "active low" : "?", |
||
141 | t == conform_trigger ? "conform" : |
||
142 | t == edge ? "edge" : |
||
143 | t == level ? "level" : "?"); |
||
144 | break; |
||
145 | } |
||
146 | case 5: |
||
147 | { |
||
148 | // Local APIC Address Override |
||
149 | dbgprintf ("Local APIC Address Override\n"); |
||
150 | break; |
||
151 | } |
||
152 | case 8: |
||
153 | { |
||
154 | // Platform Interrupt Source |
||
155 | dbgprintf ("Platform Interrupt Source\n"); |
||
156 | break; |
||
157 | } |
||
158 | } |
||
159 | |||
160 | i += h->len; |
||
161 | } |
||
162 | };>>>> |
||
163 |