static int
identify(void)
{
+ uintptr pa;
char *cp;
if((cp = getconf("*acpi")) == nil)
return 1;
- if((rsd = sigsearch("RSD PTR ")) == nil)
+ pa = (uintptr)strtoull(cp, nil, 16);
+ if(pa <= 1)
+ rsd = sigsearch("RSD PTR ");
+ else
+ rsd = vmap(pa, sizeof(Rsd));
+ if(rsd == nil)
return 1;
if(checksum(rsd, 20) && checksum(rsd, 36))
return 1;
{
microdelay(us);
}
+
+/*
+ * reset machine by writing acpi reset register.
+ */
+void
+acpireset(void)
+{
+ uchar *p;
+ Tbl *t;
+ int i;
+
+ for(i=0; i < ntblmap; i++){
+ t = tblmap[i];
+ if(memcmp(t->sig, "FACP", 4) != 0)
+ continue;
+ if(get32(t->len) <= 128)
+ break;
+ p = (uchar*)t;
+ if((get32(p + 112) & (1<<10)) == 0)
+ break;
+ if(p[116+0] != IoSpace)
+ break;
+ outb(get32(p+116+4), p[128]);
+ break;
+ }
+}