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);
|
||||
if(pa <= 1)
|
||||
rsd = sigsearch("RSD PTR ");
|
||||
else if(pa < MemMin)
|
||||
rsd = KADDR(pa);
|
||||
else
|
||||
rsd = vmap(pa, sizeof(Rsd));
|
||||
if(rsd == nil)
|
||||
|
|
|
@ -383,6 +383,7 @@ identify(void)
|
|||
{
|
||||
char *cp;
|
||||
_MP_ *_mp_;
|
||||
ulong len;
|
||||
|
||||
if((cp = getconf("*nomp")) != nil && strcmp(cp, "0") != 0)
|
||||
return 1;
|
||||
|
@ -394,16 +395,32 @@ identify(void)
|
|||
* if correct, check the version.
|
||||
* To do: check extended table checksum.
|
||||
*/
|
||||
if((_mp_ = sigsearch("_MP_")) == 0 || checksum(_mp_, _MP_sz) ||
|
||||
(_mp_->physaddr == 0))
|
||||
if((_mp_ = sigsearch("_MP_")) == nil || checksum(_mp_, _MP_sz) != 0 || _mp_->physaddr == 0)
|
||||
return 1;
|
||||
|
||||
pcmp = KADDR(_mp_->physaddr);
|
||||
if(memcmp(pcmp, "PCMP", 4) || checksum(pcmp, pcmp->length) ||
|
||||
(pcmp->version != 1 && pcmp->version != 4)) {
|
||||
len = PCMPsz;
|
||||
if(_mp_->physaddr < MemMin)
|
||||
pcmp = KADDR(_mp_->physaddr);
|
||||
else if((pcmp = vmap(_mp_->physaddr, len)) == nil)
|
||||
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;
|
||||
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)
|
||||
archmp.fastclock = tscticks;
|
||||
|
|
|
@ -267,6 +267,8 @@ typedef struct KMap KMap;
|
|||
KMap* kmap(Page*);
|
||||
void kunmap(KMap*);
|
||||
|
||||
extern u32int MemMin;
|
||||
|
||||
struct
|
||||
{
|
||||
char machs[MAXMACH]; /* active CPUs */
|
||||
|
|
|
@ -230,6 +230,8 @@ struct Mach
|
|||
typedef void KMap;
|
||||
#define VA(k) ((void*)k)
|
||||
|
||||
extern u32int MemMin;
|
||||
|
||||
struct
|
||||
{
|
||||
char machs[MAXMACH]; /* bitmap of active CPUs */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue