summaryrefslogtreecommitdiff
path: root/lib/thread/exit+openbsd-x64.s
blob: 6421cc3a354f7b6595b53448c69f9dfdbe341f8d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
/*
const thread.exit	: (stacksz : std.size -> void)
NOTE: must be called from the bottom of the stack, since
we assume that %rbp is in the top 4k of the stack.
*/
.globl thread$exit
thread$exit:
	/* find top of stack */
	movq	%rbp,%rdi	/* addr */
	andq	$~0xfff,%rdi	/* align it */
	addq	$0x1000,%rdi

	/* 
	  Because OpenBSD wants a valid stack whenever
	  we enter the kernel, we need to toss a preallocated
	  stack pointer into %rsp.
	 */
	movq	thread$exitstk,%rsp

	/* munmap(base, size) */
	movq	$73,%rax	/* munmap */
	movq	-8(%rdi),%rsi	/* size */
	subq	%rsi,%rdi	/* move to base ptr */
	syscall

	/* __threxit(0) */
	movq	$302,%rax	/* exit */
	xorq	%rdi,%rdi	/* 0 */
	syscall