aboutsummaryrefslogtreecommitdiff
path: root/i386/pc/i16/i16_raw_test_a20.S
diff options
context:
space:
mode:
Diffstat (limited to 'i386/pc/i16/i16_raw_test_a20.S')
-rw-r--r--i386/pc/i16/i16_raw_test_a20.S35
1 files changed, 35 insertions, 0 deletions
diff --git a/i386/pc/i16/i16_raw_test_a20.S b/i386/pc/i16/i16_raw_test_a20.S
new file mode 100644
index 00000000..a934e12f
--- /dev/null
+++ b/i386/pc/i16/i16_raw_test_a20.S
@@ -0,0 +1,35 @@
+
+#include <mach/machine/asm.h>
+
+ .text
+ .code16
+
+/*
+ * Test the A20 address line; return true if it is enabled.
+ */
+ENTRY(i16_raw_test_a20)
+ xorw %ax,%ax
+ movw %ax,%fs
+ notw %ax
+ movw %ax,%gs
+
+ /* See if the values in already in the corresponding locations
+ are the same. */
+ movw %fs:0,%ax
+ cmpw %gs:16,%ax
+ jnz 1f
+
+ /* Yes; try changing one and see if they're still the same. */
+ movw %ax,%dx
+ notw %ax
+ movw %ax,%fs:0
+ cmpw %gs:16,%ax
+ movw %dx,%fs:0
+ jnz 1f
+
+ xorl %eax,%eax
+ ret
+1:
+ movl $1,%eax
+ ret
+