17c478bd9Sstevel@tonic-gate/* 27c478bd9Sstevel@tonic-gate * CDDL HEADER START 37c478bd9Sstevel@tonic-gate * 47c478bd9Sstevel@tonic-gate * The contents of this file are subject to the terms of the 5*9a70fc3bSMark J. Nelson * Common Development and Distribution License (the "License"). 6*9a70fc3bSMark J. Nelson * You may not use this file except in compliance with the License. 77c478bd9Sstevel@tonic-gate * 87c478bd9Sstevel@tonic-gate * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 97c478bd9Sstevel@tonic-gate * or http://www.opensolaris.org/os/licensing. 107c478bd9Sstevel@tonic-gate * See the License for the specific language governing permissions 117c478bd9Sstevel@tonic-gate * and limitations under the License. 127c478bd9Sstevel@tonic-gate * 137c478bd9Sstevel@tonic-gate * When distributing Covered Code, include this CDDL HEADER in each 147c478bd9Sstevel@tonic-gate * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 157c478bd9Sstevel@tonic-gate * If applicable, add the following below this CDDL HEADER, with the 167c478bd9Sstevel@tonic-gate * fields enclosed by brackets "[]" replaced with your own identifying 177c478bd9Sstevel@tonic-gate * information: Portions Copyright [yyyy] [name of copyright owner] 187c478bd9Sstevel@tonic-gate * 197c478bd9Sstevel@tonic-gate * CDDL HEADER END 207c478bd9Sstevel@tonic-gate */ 217c478bd9Sstevel@tonic-gate/* 227c478bd9Sstevel@tonic-gate * Copyright 2004 Sun Microsystems, Inc. All rights reserved. 237c478bd9Sstevel@tonic-gate * Use is subject to license terms. 247c478bd9Sstevel@tonic-gate */ 257c478bd9Sstevel@tonic-gate 26*9a70fc3bSMark J. Nelson .file "unwind_frame.s" 277c478bd9Sstevel@tonic-gate 287c478bd9Sstevel@tonic-gate#include "SYS.h" 297c478bd9Sstevel@tonic-gate#include <../assym.h> 307c478bd9Sstevel@tonic-gate 317c478bd9Sstevel@tonic-gate/* Cancellation/thr_exit() stuff */ 327c478bd9Sstevel@tonic-gate 337c478bd9Sstevel@tonic-gate/* 347c478bd9Sstevel@tonic-gate * _ex_unwind_local(void) 357c478bd9Sstevel@tonic-gate * 367c478bd9Sstevel@tonic-gate * Called only from _t_cancel(). 377c478bd9Sstevel@tonic-gate * Unwind two frames and invoke _t_cancel(fp) again. 387c478bd9Sstevel@tonic-gate * 397c478bd9Sstevel@tonic-gate * Before this the call stack is: f4 f3 f2 f1 _t_cancel 407c478bd9Sstevel@tonic-gate * After this the call stack is: f4 f3 f2 _t_cancel 417c478bd9Sstevel@tonic-gate * (as if "call f1" is replaced by "call _t_cancel(fp)" in f2) 427c478bd9Sstevel@tonic-gate */ 437c478bd9Sstevel@tonic-gate ENTRY(_ex_unwind_local) 447c478bd9Sstevel@tonic-gate restore 457c478bd9Sstevel@tonic-gate restore 467c478bd9Sstevel@tonic-gate ba _t_cancel ! tailcall _t_cancel(fp) 477c478bd9Sstevel@tonic-gate mov %fp, %o0 ! passing the frame pointer 487c478bd9Sstevel@tonic-gate SET_SIZE(_ex_unwind_local) 497c478bd9Sstevel@tonic-gate 507c478bd9Sstevel@tonic-gate/* 517c478bd9Sstevel@tonic-gate * _ex_clnup_handler(void *arg, void (*clnup)(void *)) 527c478bd9Sstevel@tonic-gate * 537c478bd9Sstevel@tonic-gate * Called only from _t_cancel(). 547c478bd9Sstevel@tonic-gate * Unwind one frame, call the cleanup handler with argument arg from the 557c478bd9Sstevel@tonic-gate * restored frame, then jump to _t_cancel(fp) again from the restored frame. 567c478bd9Sstevel@tonic-gate */ 577c478bd9Sstevel@tonic-gate ENTRY(_ex_clnup_handler) 587c478bd9Sstevel@tonic-gate mov %o1, %i1 ! handler address -> %o1 after restore 597c478bd9Sstevel@tonic-gate restore %o0, %g0, %o0 ! handler arg -> %o0 after restore 607c478bd9Sstevel@tonic-gate stn %o7, [%g7 + UL_UNWIND_RET] ! save caller's return address 617c478bd9Sstevel@tonic-gate jmpl %o1, %o7 ! invoke func with arg 627c478bd9Sstevel@tonic-gate nop ! and return here 637c478bd9Sstevel@tonic-gate ldn [%g7 + UL_UNWIND_RET], %o7 ! restore return address 647c478bd9Sstevel@tonic-gate ba _t_cancel ! tailcall _t_cancel(fp) 657c478bd9Sstevel@tonic-gate mov %fp, %o0 ! passing the frame pointer 667c478bd9Sstevel@tonic-gate SET_SIZE(_ex_clnup_handler) 677c478bd9Sstevel@tonic-gate 687c478bd9Sstevel@tonic-gate/* 697c478bd9Sstevel@tonic-gate * _thrp_unwind(void *arg) 707c478bd9Sstevel@tonic-gate * 717c478bd9Sstevel@tonic-gate * Ignore the argument; jump to _t_cancel(fp) with caller's fp 727c478bd9Sstevel@tonic-gate */ 737c478bd9Sstevel@tonic-gate ENTRY(_thrp_unwind) 747c478bd9Sstevel@tonic-gate ba _t_cancel ! tailcall _t_cancel(fp) 757c478bd9Sstevel@tonic-gate mov %fp, %o0 ! passing the frame pointer 767c478bd9Sstevel@tonic-gate SET_SIZE(_thrp_unwind) 77