summaryrefslogtreecommitdiff
path: root/gnu/egcs/gcc/config/rs6000/ntstack.asm
blob: aa4179e7a79bc4436ed3b7c768811920a01674cb (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
31
32
33
34
35
36
37
38
39
40
41
42
# Allocate stack for NT, inserting stack probes every 4k pages

	.file	"ntstack.asm"

#	Setup MS Structured-Exception-Handling
	.pdata
	.align 2
	.ualong ..__allocate_stack,__allocate_stack.e,0,0,__allocate_stack.b

#	Switch to the relocation section
	.reldata
	.globl __allocate_stack
	.globl ..__allocate_stack
__allocate_stack:
	.ualong ..__allocate_stack,.toc

	.text
	.align 2
..__allocate_stack:
	.function	..__allocate_stack
__allocate_stack.b:
	addi	3,3,15			# round up to 16 byte alignment
	lwz	0,0(1)			# old stack link
	rlwinm	3,3,0,0,28
	srawi.	4,3,12			# get # of pages to check
	neg	3,3			# negate so we can use stwux
	bgt-	0,.Lcheck
	stwux	0,1,3			# small request, just decrement and return
	blr

.Lcheck:
	mtctr	4			# number of pages to check
	mr	5,1			# tmp pointer
.Lloop:
	lwzu	6,-4096(5)		# touch the page
	bdnz+	.Lloop			# and loop back

	stwux	0,1,3			# update stack pointer
	blr

__allocate_stack.e:
FE_MOT_RESVD..__allocate_stack: