static struct mpconf * mpconf(struct mp **mptab) { struct mp *mp = mpsearch(); struct mpconf *conf; if ((mp) && (mp->conftab)) { conf = mp->conftab; if (!kmemcmp(conf, "PCMP", 4)) { if ((conf->ver == 1 || conf->ver == 4) && !mpchksum((uint8_t *)conf, conf->len)) { *mptab = mp; return conf; } else { return NULL; } } else { return NULL; } } return NULL; }
// Search for an MP configuration table. For now, don't accept the // default configurations (physaddr == 0). // Check for the correct signature, checksum, and version. static struct mpconf * mpconfig(struct mp **pmp) { struct mpconf *conf; struct mp *mp; if ((mp = mpsearch()) == 0) return NULL; if (mp->physaddr == 0 || mp->type != 0) { cprintf("SMP: Default configurations not implemented\n"); return NULL; } conf = (struct mpconf *) KADDR(mp->physaddr); if (memcmp(conf, "PCMP", 4) != 0) { cprintf("SMP: Incorrect MP configuration table signature\n"); return NULL; } if (sum(conf, conf->length) != 0) { cprintf("SMP: Bad MP configuration checksum\n"); return NULL; } if (conf->version != 1 && conf->version != 4) { cprintf("SMP: Unsupported MP version %d\n", conf->version); return NULL; } if (sum((uint8_t *)conf + conf->length, conf->xlength) != conf->xchecksum) { cprintf("SMP: Bad MP configuration extended checksum\n"); return NULL; } *pmp = mp; return conf; }
// Search for an MP configuration table. For now, // don 't accept the default configurations (physaddr == 0). // Check for correct signature, calculate the checksum and, // if correct, check the version. // To do: check extended table checksum. static struct mpconf * mpconfig(struct mp **pmp) { struct mpconf *conf; struct mp *mp; if ((mp = mpsearch()) == 0 || mp->physaddr == 0) return 0; conf = (struct mpconf *) mp->physaddr; if (memcmp(conf, "PCMP", 4) != 0) return 0; if (conf->version != 1 && conf->version != 4) return 0; if (sum((uint8_t *) conf, conf->length) != 0) return 0; *pmp = mp; return conf; }
// Search for an MP configuration table. For now, // don't accept the default configurations (physaddr == 0). // Check for correct signature, calculate the checksum and, // if correct, check the version. // To do: check extended table checksum. static struct mpconf* mpconfig(struct mp **pmp) { struct mpconf *conf; struct mp *mp; if((mp = mpsearch()) == 0 || mp->physaddr == 0) { return 0; } conf = (struct mpconf*) p2v((uint) mp->physaddr); if(memcmp(conf, "PCMP", 4) != 0) { return 0; } if(conf->version != 1 && conf->version != 4) { return 0; } if(sum((uchar*)conf, conf->length) != 0) { return 0; } *pmp = mp; return conf; }
static int identify(void) { PCMP *pcmp; uchar *p, sum; ulong length; if(getconf("*nomp")) return 1; /* * Search for an MP configuration table. For now, * don't accept the default configurations (physaddr == 0). * Check for correct signature, calculate the checksum and, * if correct, check the version. * To do: check extended table checksum. */ if((_mp_ = mpsearch()) == 0 || _mp_->physaddr == 0) return 1; pcmp = KADDR(_mp_->physaddr); if(memcmp(pcmp, "PCMP", 4)) return 1; length = pcmp->length; sum = 0; for(p = (uchar*)pcmp; length; length--) sum += *p++; if(sum || (pcmp->version != 1 && pcmp->version != 4)) return 1; if(cpuserver && m->havetsc) archmp.fastclock = tscticks; return 0; }