pc kernel: handle PCMP and RSD being in low (kaddr) or reserved (vmap) memory
on thinkpad x1v4, the PCMP structure resides in upper reserved memory pa=0xd7f49000 - while system memory ends at 0x0ffff000; so we have to vmap() it instead of KADDR(). the RSD structure for ACPI might reside in low memory, so we sould KADDR() in that case.
This commit is contained in:
parent
152159a829
commit
4e8494aad7
4 changed files with 28 additions and 5 deletions
|
@ -789,6 +789,8 @@ identify(void)
|
||||||
pa = (uintptr)strtoull(cp, nil, 16);
|
pa = (uintptr)strtoull(cp, nil, 16);
|
||||||
if(pa <= 1)
|
if(pa <= 1)
|
||||||
rsd = sigsearch("RSD PTR ");
|
rsd = sigsearch("RSD PTR ");
|
||||||
|
else if(pa < MemMin)
|
||||||
|
rsd = KADDR(pa);
|
||||||
else
|
else
|
||||||
rsd = vmap(pa, sizeof(Rsd));
|
rsd = vmap(pa, sizeof(Rsd));
|
||||||
if(rsd == nil)
|
if(rsd == nil)
|
||||||
|
|
|
@ -383,6 +383,7 @@ identify(void)
|
||||||
{
|
{
|
||||||
char *cp;
|
char *cp;
|
||||||
_MP_ *_mp_;
|
_MP_ *_mp_;
|
||||||
|
ulong len;
|
||||||
|
|
||||||
if((cp = getconf("*nomp")) != nil && strcmp(cp, "0") != 0)
|
if((cp = getconf("*nomp")) != nil && strcmp(cp, "0") != 0)
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -394,16 +395,32 @@ identify(void)
|
||||||
* if correct, check the version.
|
* if correct, check the version.
|
||||||
* To do: check extended table checksum.
|
* To do: check extended table checksum.
|
||||||
*/
|
*/
|
||||||
if((_mp_ = sigsearch("_MP_")) == 0 || checksum(_mp_, _MP_sz) ||
|
if((_mp_ = sigsearch("_MP_")) == nil || checksum(_mp_, _MP_sz) != 0 || _mp_->physaddr == 0)
|
||||||
(_mp_->physaddr == 0))
|
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
|
len = PCMPsz;
|
||||||
|
if(_mp_->physaddr < MemMin)
|
||||||
pcmp = KADDR(_mp_->physaddr);
|
pcmp = KADDR(_mp_->physaddr);
|
||||||
if(memcmp(pcmp, "PCMP", 4) || checksum(pcmp, pcmp->length) ||
|
else if((pcmp = vmap(_mp_->physaddr, len)) == nil)
|
||||||
(pcmp->version != 1 && pcmp->version != 4)) {
|
return 1;
|
||||||
|
if(pcmp->length < len
|
||||||
|
|| memcmp(pcmp, "PCMP", 4) != 0
|
||||||
|
|| (pcmp->version != 1 && pcmp->version != 4)){
|
||||||
|
Bad:
|
||||||
|
if((uintptr)pcmp < KZERO)
|
||||||
|
vunmap(pcmp, len);
|
||||||
pcmp = nil;
|
pcmp = nil;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
len = pcmp->length;
|
||||||
|
if((uintptr)pcmp < KZERO)
|
||||||
|
vunmap(pcmp, PCMPsz);
|
||||||
|
if(_mp_->physaddr < MemMin)
|
||||||
|
pcmp = KADDR(_mp_->physaddr);
|
||||||
|
else if((pcmp = vmap(_mp_->physaddr, len)) == nil)
|
||||||
|
return 1;
|
||||||
|
if(checksum(pcmp, len) != 0)
|
||||||
|
goto Bad;
|
||||||
|
|
||||||
if(m->havetsc && getconf("*notsc") == nil)
|
if(m->havetsc && getconf("*notsc") == nil)
|
||||||
archmp.fastclock = tscticks;
|
archmp.fastclock = tscticks;
|
||||||
|
|
|
@ -267,6 +267,8 @@ typedef struct KMap KMap;
|
||||||
KMap* kmap(Page*);
|
KMap* kmap(Page*);
|
||||||
void kunmap(KMap*);
|
void kunmap(KMap*);
|
||||||
|
|
||||||
|
extern u32int MemMin;
|
||||||
|
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
char machs[MAXMACH]; /* active CPUs */
|
char machs[MAXMACH]; /* active CPUs */
|
||||||
|
|
|
@ -230,6 +230,8 @@ struct Mach
|
||||||
typedef void KMap;
|
typedef void KMap;
|
||||||
#define VA(k) ((void*)k)
|
#define VA(k) ((void*)k)
|
||||||
|
|
||||||
|
extern u32int MemMin;
|
||||||
|
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
char machs[MAXMACH]; /* bitmap of active CPUs */
|
char machs[MAXMACH]; /* bitmap of active CPUs */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue