11.14Sriastrad/* $NetBSD: _resumecontext.S,v 1.14 2025/04/25 00:08:38 riastradh Exp $ */ 21.2Sthorpej 31.2Sthorpej/*- 41.2Sthorpej * Copyright (c) 2001 The NetBSD Foundation, Inc. 51.2Sthorpej * All rights reserved. 61.2Sthorpej * 71.2Sthorpej * This code is derived from software contributed to The NetBSD Foundation 81.2Sthorpej * by Wayne Knowles. 91.2Sthorpej * 101.2Sthorpej * Redistribution and use in source and binary forms, with or without 111.2Sthorpej * modification, are permitted provided that the following conditions 121.2Sthorpej * are met: 131.2Sthorpej * 1. Redistributions of source code must retain the above copyright 141.2Sthorpej * notice, this list of conditions and the following disclaimer. 151.2Sthorpej * 2. Redistributions in binary form must reproduce the above copyright 161.2Sthorpej * notice, this list of conditions and the following disclaimer in the 171.2Sthorpej * documentation and/or other materials provided with the distribution. 181.2Sthorpej * 191.2Sthorpej * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 201.2Sthorpej * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 211.2Sthorpej * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 221.2Sthorpej * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 231.2Sthorpej * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 241.2Sthorpej * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 251.2Sthorpej * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 261.2Sthorpej * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 271.2Sthorpej * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 281.2Sthorpej * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 291.2Sthorpej * POSSIBILITY OF SUCH DAMAGE. 301.2Sthorpej */ 311.2Sthorpej 321.6Smatt#include <machine/asm.h> 331.14Sriastrad#include <machine/param.h> 341.6Smatt 351.2Sthorpej#include "SYS.h" 361.6Smatt#include "assym.h" 371.2Sthorpej 381.2Sthorpej#if defined(SYSLIBC_SCCS) && !defined(lint) 391.14Sriastrad RCSID("$NetBSD: _resumecontext.S,v 1.14 2025/04/25 00:08:38 riastradh Exp $") 401.2Sthorpej#endif /* SYSLIBC_SCCS && !lint */ 411.2Sthorpej 421.2Sthorpej .set reorder 431.6Smatt .hidden _C_LABEL(__resumecontext) 441.8Sskrll 451.14Sriastrad#define UCONTEXT_SIZE_ALIGNED \ 461.14Sriastrad (((UCONTEXT_SIZE + STACK_ALIGNBYTES)/(STACK_ALIGNBYTES + 1)) \ 471.14Sriastrad * (STACK_ALIGNBYTES + 1)) 481.14Sriastrad 491.2SthorpejLEAF_NOPROFILE(__resumecontext) 501.6Smatt /* 511.6Smatt * We get here not by a call through $t9 but thru $ra after the 521.11Sskrll * function passed to makecontext returns. Therefore, we need 531.11Sskrll * to recover gp from ra 541.6Smatt */ 551.11Sskrll#if defined(__mips_o32) || defined(__mips_o64) 561.11Sskrll .set push 571.11Sskrll .set noreorder 581.11Sskrll .cpload ra 591.11Sskrll .set pop 601.11Sskrll#endif 611.11Sskrll#if defined(__mips_n32) || defined(__mips_n64) 621.11Sskrll .cpsetup ra, t3, __resumecontext 631.11Sskrll#endif 641.12Sskrll 651.14Sriastrad PTR_SUBU sp, sp, UCONTEXT_SIZE_ALIGNED # get space for ucontext 661.6Smatt move a0, sp # arg0 for getcontext 671.13Sskrll PTR_S zero, _UC_LINK(a0) # make sure uc_link is 0 681.6Smatt SYSTRAP(getcontext) # get context 691.11Sskrll 701.11Sskrll#if defined(__mips_n32) || defined(__mips_n64) 711.11Sskrll REG_PROLOGUE 721.11Sskrll /* We saved gp in t2 above */ 731.13Sskrll REG_S t3, _UC_GREGS_GP(a0) 741.11Sskrll REG_EPILOGUE 751.11Sskrll#endif 761.11Sskrll 771.13Sskrll PTR_L a0, _UC_LINK(a0) # linked context? 781.10Sskrll NOP_L 791.6Smatt beq a0, zero, 1f # nope, exit process 801.6Smatt nop 811.11Sskrll PIC_TAILCALL(setcontext) # yes, become it. 821.6Smatt /* NOTREACHED (in theory) */ 831.8Sskrll li a0, -1 # failure, 841.6Smatt1: 851.6Smatt SYSTRAP(exit) # all hope is lost. 861.6Smatt /* NOTREACHED */ 871.2SthorpejEND(__resumecontext) 88