diff options
author | mischief <mischief@offblast.org> | 2014-06-24 18:02:25 -0700 |
---|---|---|
committer | mischief <mischief@offblast.org> | 2014-06-24 18:02:25 -0700 |
commit | 5ba95fdb07ddc2c32111a1b2f57f17aa27fcbbf5 (patch) | |
tree | c1ec54cb9ecff85b0b820a26d26a10a32a118d0c /sys/src/9/xen/plan9l.s | |
parent | fa03455b5057675b18d1c87aef2d1071b2088de0 (diff) |
import xen 32 bit paravirtual kernel from /n/sources/xen.
Diffstat (limited to 'sys/src/9/xen/plan9l.s')
-rw-r--r-- | sys/src/9/xen/plan9l.s | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/sys/src/9/xen/plan9l.s b/sys/src/9/xen/plan9l.s new file mode 100644 index 000000000..e5e2f541c --- /dev/null +++ b/sys/src/9/xen/plan9l.s @@ -0,0 +1,53 @@ +#include "xendefs.h" +#include "mem.h" + +/* + * This must match io.h. + */ +#define VectorSYSCALL 0x40 + +/* + * Used to get to the first process: + * set up an interrupt return frame and IRET to user level. + */ +TEXT touser(SB), $0 + PUSHL $(UDSEL) /* old ss */ + MOVL sp+0(FP), AX /* old sp */ + PUSHL AX + MOVL $0x200, AX /* interrupt enable flag */ + PUSHL AX /* old flags */ + PUSHL $(UESEL) /* old cs */ + PUSHL $(UTZERO+32) /* old pc */ + MOVL $(UDSEL), AX + MOVW AX, DS + MOVW AX, ES + MOVW AX, GS + MOVW AX, FS + IRETL + +/* + * This is merely _strayintr from l.s optimised to vector + * to syscall() without going through trap(). + */ +TEXT _syscallintr(SB), $0 + PUSHL $VectorSYSCALL /* trap type */ + + PUSHL DS + PUSHL ES + PUSHL FS + PUSHL GS + PUSHAL + MOVL $(KDSEL), AX + MOVW AX, DS + MOVW AX, ES + PUSHL SP + CALL syscall(SB) + + POPL AX + POPAL + POPL GS + POPL FS + POPL ES + POPL DS + ADDL $8, SP /* pop error code and trap type */ + IRETL |