/* Copyright (C) 2013 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library. If not, see
. */
#include
/*
Save the PID value, save 0x80000000 if PID was 0.
Registers a2 and a3 are available; ar should return the PID and as threadptr
*/
#define SAVE_PID(pid,tp,ar,as) \
rur tp, threadptr; \
movi ar, TLS_PRE_TCB_SIZE; \
sub tp, tp, ar; \
l32i pid, tp, PID; \
neg ar, pid; \
movi as, 0x80000000; \
moveqz ar, as, ar; \
s32i ar, tp, PID; \
/*
Restore the PID value, restore to 0 if saved value was 0x80000000
Return value from the syscall is in a2.
*/
#define RESTORE_PID(pid,tp,res) \
beqz res, 1f; \
s32i pid, tp, PID; \
1:
/*
Special version for call12, where we don't have enough registers
available to preserve the original PID.
*/
#define RESTORE_PID12(ar, as, at) \
rur as, threadptr; \
movi ar, TLS_PRE_TCB_SIZE; \
sub as, as, ar; \
l32i ar, as, PID; \
movi at, 0x80000000; \
sub at, at, ar; \
neg ar, ar; \
moveqz ar, at, at; \
s32i ar, as, PID;
#include