xref: /minix3/lib/libc/arch/or1k/sys/brk.S (revision 0a6a1f1d05b60e214de2f05a7310ddd1f0e590e7)
1*0a6a1f1dSLionel Sambuc/*	$NetBSD: brk.S,v 1.1 2014/09/03 19:34:26 matt Exp $	*/
2*0a6a1f1dSLionel Sambuc
3*0a6a1f1dSLionel Sambuc#include "SYS.h"
4*0a6a1f1dSLionel Sambuc
5*0a6a1f1dSLionel Sambuc#if defined(LIBC_SCCS) && !defined(lint)
6*0a6a1f1dSLionel Sambuc__RCSID("$NetBSD: brk.S,v 1.1 2014/09/03 19:34:26 matt Exp $")
7*0a6a1f1dSLionel Sambuc#endif /* LIBC_SCCS && !lint */
8*0a6a1f1dSLionel Sambuc
9*0a6a1f1dSLionel Sambuc	.hidden	_C_LABEL(__curbrk)
10*0a6a1f1dSLionel Sambuc	.hidden	_C_LABEL(__minbrk)
11*0a6a1f1dSLionel Sambuc	.globl	_C_LABEL(__curbrk)
12*0a6a1f1dSLionel Sambuc	.globl	_C_LABEL(__minbrk)
13*0a6a1f1dSLionel Sambuc	.globl	_C_LABEL(_end)
14*0a6a1f1dSLionel Sambuc
15*0a6a1f1dSLionel Sambuc#ifdef WEAK_ALIAS
16*0a6a1f1dSLionel SambucWEAK_ALIAS(brk, _brk)
17*0a6a1f1dSLionel Sambuc#endif
18*0a6a1f1dSLionel Sambuc	.data
19*0a6a1f1dSLionel Sambuc	.p2align 2
20*0a6a1f1dSLionel Sambuc_C_LABEL(__minbrk):
21*0a6a1f1dSLionel Sambuc	.long	_C_LABEL(_end)
22*0a6a1f1dSLionel Sambuc_C_LABEL(__curbrk):
23*0a6a1f1dSLionel Sambuc	.long	_C_LABEL(_end)
24*0a6a1f1dSLionel Sambuc
25*0a6a1f1dSLionel Sambuc	.text
26*0a6a1f1dSLionel SambucENTRY(_brk)
27*0a6a1f1dSLionel Sambuc#ifdef __PIC__
28*0a6a1f1dSLionel Sambuc	l.or	r8,r9,r0
29*0a6a1f1dSLionel Sambuc	PIC_GOTSETUP(r7)
30*0a6a1f1dSLionel Sambuc	l.or	r9,r8,r0
31*0a6a1f1dSLionel Sambuc	l.movhi	r6,gotoffhi(_C_LABEL(__minbrk))
32*0a6a1f1dSLionel Sambuc	l.ori	r6,r6,gotofflo(_C_LABEL(__minbrk))
33*0a6a1f1dSLionel Sambuc	l.add	r6,r6,r7
34*0a6a1f1dSLionel Sambuc#else
35*0a6a1f1dSLionel Sambuc	l.movhi	r6,hi(_C_LABEL(__minbrk))
36*0a6a1f1dSLionel Sambuc	l.ori	r6,r6,lo(_C_LABEL(__minbrk))
37*0a6a1f1dSLionel Sambuc#endif
38*0a6a1f1dSLionel Sambuc	l.lwz	r5,0(r6)		# r5 = __minbrk
39*0a6a1f1dSLionel Sambuc	l.sfgts	r5,r3			# if (__minbrk <= r3)
40*0a6a1f1dSLionel Sambuc	l.cmov	r5,r5,r3		# choose larger
41*0a6a1f1dSLionel Sambuc	l.or	r3,r5,r0		# new break value
42*0a6a1f1dSLionel Sambuc	_DOSYSCALL(break)		# assume, that r5 is kept
43*0a6a1f1dSLionel Sambuc	l.bf	_C_LABEL(__cerror)
44*0a6a1f1dSLionel Sambuc	l.nop
45*0a6a1f1dSLionel Sambuc	l.sw	__SIZEOF_POINTER__(r6),r5
46*0a6a1f1dSLionel Sambuc	l.xor	r11, r11, r11		# return 0
47*0a6a1f1dSLionel Sambuc	l.jr	lr			# return 0
48*0a6a1f1dSLionel Sambuc	l.nop
49*0a6a1f1dSLionel SambucEND(_brk)
50