Changeset 50a4e25 in mainline
- Timestamp:
- 2005-09-06T21:30:55Z (19 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 2cd073bd
- Parents:
- b49f4ae
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
arch/ia32/src/acpi/madt.c
rb49f4ae r50a4e25 37 37 #include <config.h> 38 38 #include <print.h> 39 #include <mm/heap.h> 40 #include <memstr.h> 39 41 40 42 struct acpi_madt *acpi_madt = NULL; … … 42 44 #ifdef __SMP__ 43 45 44 /* 45 * NOTE: it is currently not completely clear to the authors of SPARTAN whether 46 * MADT can exist in such a form that entries of the same type are not consecutive. 47 * Because of this uncertainity, some entry types are explicitly checked for 48 * being consecutive with other entries of the same kind. 49 */ 50 51 static void madt_l_apic_entry(struct madt_l_apic *la, __u8 prev_type); 52 static void madt_io_apic_entry(struct madt_io_apic *ioa, __u8 prev_type); 46 static void madt_l_apic_entry(struct madt_l_apic *la, __u32 index); 47 static void madt_io_apic_entry(struct madt_io_apic *ioa, __u32 index); 53 48 54 49 struct madt_l_apic *madt_l_apic_entries = NULL; 55 50 struct madt_io_apic *madt_io_apic_entries = NULL; 56 51 52 __u32 madt_l_apic_entry_index = 0; 53 __u32 madt_io_apic_entry_index = 0; 57 54 int madt_l_apic_entry_cnt = 0; 58 55 int madt_io_apic_entry_cnt = 0; 56 57 struct madt_apic_header * * madt_entries_index = NULL; 58 int madt_entries_index_cnt = 0; 59 59 60 60 char *entry[] = { … … 93 93 { 94 94 ASSERT(i < madt_l_apic_entry_cnt); 95 return madt_l_apic_entries[i].flags & 0x1; 95 return ((struct madt_l_apic *) madt_entries_index[madt_l_apic_entry_index + i])->flags & 0x1; 96 96 97 } 97 98 … … 99 100 { 100 101 ASSERT(i < madt_l_apic_entry_cnt); 101 return madt_l_apic_entries[i].apic_id == l_apic_id();102 return ((struct madt_l_apic *) madt_entries_index[madt_l_apic_entry_index + i])->apic_id == l_apic_id(); 102 103 } 103 104 … … 105 106 { 106 107 ASSERT(i < madt_l_apic_entry_cnt); 107 return madt_l_apic_entries[i].apic_id;108 return ((struct madt_l_apic *) madt_entries_index[madt_l_apic_entry_index + i])->apic_id; 108 109 } 109 110 … … 111 112 { 112 113 struct madt_apic_header *end = (struct madt_apic_header *) (((__u8 *) acpi_madt) + acpi_madt->header.length); 113 struct madt_apic_header *h = &acpi_madt->apic_header[0]; 114 __u8 prev_type = 0; /* used to detect inconsecutive entries */ 115 116 117 l_apic = (__u32 *) (__native) acpi_madt->l_apic_address; 118 119 while (h < end) { 114 struct madt_apic_header *h; 115 116 /* calculate madt entries */ 117 for (h = &acpi_madt->apic_header[0]; h < end; h = (struct madt_apic_header *) (((__u8 *) h) + h->length)) { 118 madt_entries_index_cnt++; 119 } 120 printf("MADT: Found %d entries\n", madt_entries_index_cnt); 121 122 /* create madt apic entries index array */ 123 madt_entries_index = (struct madt_apic_header * *) malloc(madt_entries_index_cnt * sizeof(struct madt_apic_header * *)); 124 125 __u32 index = 0; 126 127 for (h = &acpi_madt->apic_header[0]; h < end; h = (struct madt_apic_header *) (((__u8 *) h) + h->length)) { 128 madt_entries_index[index++] = h; 129 } 130 131 132 /* Bublesort madt index. Quicksort later. */ 133 bool done = false; 134 135 while (!done) { 136 done = true; 137 for (index = 0; index < madt_entries_index_cnt - 1; index++) { 138 if (madt_entries_index[index]->type > madt_entries_index[index + 1]->type) { 139 h = madt_entries_index[index]; 140 madt_entries_index[index] = madt_entries_index[index + 1]; 141 madt_entries_index[index + 1] = h; 142 done = false; 143 } 144 } 145 146 } 147 148 149 /* Parse MADT entries */ 150 for (index = 0; index < madt_entries_index_cnt - 1; index++) { 151 h = madt_entries_index[index]; 120 152 switch (h->type) { 121 153 case MADT_L_APIC: 122 madt_l_apic_entry((struct madt_l_apic *) h, prev_type);154 madt_l_apic_entry((struct madt_l_apic *) h, index); 123 155 break; 124 156 case MADT_IO_APIC: 125 madt_io_apic_entry((struct madt_io_apic *) h, prev_type);157 madt_io_apic_entry((struct madt_io_apic *) h, index); 126 158 break; 127 159 case MADT_INTR_SRC_OVRD: … … 144 176 break; 145 177 } 146 prev_type = h->type; 147 h = (struct madt_apic_header *) (((__u8 *) h) + h->length); 148 } 178 179 180 } 181 149 182 150 183 if (madt_l_apic_entry_cnt) … … 152 185 } 153 186 154 void madt_l_apic_entry(struct madt_l_apic *la, __u8 prev_type) 155 { 156 /* check for consecutiveness */ 157 if (madt_l_apic_entry_cnt && prev_type != MADT_L_APIC) 158 panic("%s entries are not consecuitve\n", entry[MADT_L_APIC]); 159 160 if (!madt_l_apic_entry_cnt++) 161 madt_l_apic_entries = la; 187 188 void madt_l_apic_entry(struct madt_l_apic *la, __u32 index) 189 { 190 if (!madt_l_apic_entry_cnt++) { 191 madt_l_apic_entry_index = index; 192 } 162 193 163 194 if (!(la->flags & 0x1)) { … … 169 200 } 170 201 171 void madt_io_apic_entry(struct madt_io_apic *ioa, __u8 prev_type) 172 { 173 /* check for consecutiveness */ 174 if (madt_io_apic_entry_cnt && prev_type != MADT_IO_APIC) 175 panic("%s entries are not consecuitve\n", entry[MADT_IO_APIC]); 176 202 void madt_io_apic_entry(struct madt_io_apic *ioa, __u32 index) 203 { 177 204 if (!madt_io_apic_entry_cnt++) { 178 madt_io_apic_entries = ioa; 205 /* remember index of the first io apic entry */ 206 madt_io_apic_entry_index = index; 207 /* ????!!!! */ 179 208 io_apic = (__u32 *) (__native) ioa->io_apic_address; 180 } 181 else { 209 } else { 182 210 /* currently not supported */ 183 211 return;
Note:
See TracChangeset
for help on using the changeset viewer.