summaryrefslogtreecommitdiff
path: root/sys/src/libaml
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@gmx.de>2013-09-07 14:40:24 +0200
committercinap_lenrek <cinap_lenrek@gmx.de>2013-09-07 14:40:24 +0200
commitcf166c38502cdde9ca2ab5de3c4dad70b58328c2 (patch)
tree386196dd1a92df8c6337fac0a4b8823377cdfb1e /sys/src/libaml
parent81618e61df9a640f756d6f9194904d0c817b98b9 (diff)
libaml: amldelay(), _OSI(), fix bug in Load() (from plhk's acpi patch)
export amldelay() for microsecond sleeps. implement _OSI() method. fix rwreg argument in evalload()
Diffstat (limited to 'sys/src/libaml')
-rw-r--r--sys/src/libaml/aml.c43
-rw-r--r--sys/src/libaml/amldelay.c8
-rw-r--r--sys/src/libaml/mkfile1
3 files changed, 48 insertions, 4 deletions
diff --git a/sys/src/libaml/aml.c b/sys/src/libaml/aml.c
index 7487ab9c5..0de0297a9 100644
--- a/sys/src/libaml/aml.c
+++ b/sys/src/libaml/aml.c
@@ -1788,7 +1788,7 @@ evalload(void)
if(FP->arg[0] == nil)
return nil;
- l = rwreg(FP->arg[0], LenOffset, 32, 0, 0);
+ l = rwreg(FP->arg[0], LenOffset, 4, 0, 0);
if(l <= HdrLen)
return nil;
@@ -1819,6 +1819,20 @@ evalload(void)
return tid;
}
+static void*
+evalstall(void)
+{
+ amldelay(ival(FP->arg[0]));
+ return nil;
+}
+
+static void*
+evalsleep(void)
+{
+ amldelay(ival(FP->arg[0])*1000);
+ return nil;
+}
+
static Op optab[] = {
[Obad] "", "", evalbad,
[Onop] "Noop", "", evalnop,
@@ -1906,8 +1920,8 @@ static Op optab[] = {
[Oacq] "Acquire", "@2", evalnop,
[Orel] "Release", "@", evalnop,
- [Ostall] "Stall", "i", evalnop,
- [Osleep] "Sleep", "i", evalnop,
+ [Ostall] "Stall", "i", evalstall,
+ [Osleep] "Sleep", "i", evalsleep,
[Oload] "Load", "*@}", evalload,
[Ounload] "Unload", "@", evalnop,
};
@@ -2036,6 +2050,27 @@ amlnew(char tag, int len)
}
}
+static void*
+evalosi(void)
+{
+ static char *w[] = {
+ "Windows 2001",
+ "Windows 2001 SP1",
+ "Windows 2001 SP2",
+ "Windows 2006",
+ };
+ char *s;
+ int i;
+
+ s = deref(FP->arg[0]);
+ if(s == nil || TAG(s) != 's')
+ return nil;
+ for(i = 0; i < nelem(w); i++)
+ if(strcmp(s, w[i]) == 0)
+ return mki(0xFFFFFFFF);
+ return nil;
+}
+
void
amlinit(void)
{
@@ -2065,7 +2100,7 @@ amlinit(void)
m = mk('m', sizeof(Method));
m->narg = 1;
- m->eval = evalnop;
+ m->eval = evalosi;
m->name = n;
n->v = m;
}
diff --git a/sys/src/libaml/amldelay.c b/sys/src/libaml/amldelay.c
new file mode 100644
index 000000000..804352bf5
--- /dev/null
+++ b/sys/src/libaml/amldelay.c
@@ -0,0 +1,8 @@
+#include <u.h>
+#include <libc.h>
+#include <aml.h>
+
+void
+amldelay(int)
+{
+}
diff --git a/sys/src/libaml/mkfile b/sys/src/libaml/mkfile
index d012bb52c..f4a048bc1 100644
--- a/sys/src/libaml/mkfile
+++ b/sys/src/libaml/mkfile
@@ -6,6 +6,7 @@ OFILES=\
amlmapio.$O\
amlunmapio.$O\
amlalloc.$O\
+ amldelay.$O\
HFILES=/sys/include/aml.h