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:
cinap_lenrek 2017-03-25 04:08:14 +01:00
parent 152159a829
commit 4e8494aad7
4 changed files with 28 additions and 5 deletions

View file

@ -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)

View file

@ -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;
len = PCMPsz;
if(_mp_->physaddr < MemMin)
pcmp = KADDR(_mp_->physaddr);
if(memcmp(pcmp, "PCMP", 4) || checksum(pcmp, pcmp->length) ||
(pcmp->version != 1 && pcmp->version != 4)) {
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;

View file

@ -267,6 +267,8 @@ typedef struct KMap KMap;
KMap* kmap(Page*);
void kunmap(KMap*);
extern u32int MemMin;
struct
{
char machs[MAXMACH]; /* active CPUs */

View file

@ -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 */