2N/A * The contents of this file are subject to the terms of the 2N/A * Common Development and Distribution License (the "License"). 2N/A * You may not use this file except in compliance with the License. 2N/A * See the License for the specific language governing permissions 2N/A * and limitations under the License. 2N/A * When distributing Covered Code, include this CDDL HEADER in each 2N/A * If applicable, add the following below this CDDL HEADER, with the 2N/A * fields enclosed by brackets "[]" replaced with your own identifying 2N/A * information: Portions Copyright [yyyy] [name of copyright owner] 2N/A * Copyright 2008 Sun Microsystems, Inc. All rights reserved. 2N/A * Use is subject to license terms. 2N/A * ptrace(2) interface built on top of proc(4). 2N/A * All my children... 2N/A/* fake u-block offsets */ 2N/A#
define REGADDR 0xffff0000 /* arbitrary kernel address for u_ar0 */ 2N/A/* external routines defined in this module */ 2N/A/* static routines defined in this module */ 2N/A case 0:
return (
"PTRACE_TRACEME");
2N/A case 1:
return (
"PTRACE_PEEKTEXT");
2N/A case 2:
return (
"PTRACE_PEEKDATA");
2N/A case 3:
return (
"PTRACE_PEEKUSER");
2N/A case 4:
return (
"PTRACE_POKETEXT");
2N/A case 5:
return (
"PTRACE_POKEDATA");
2N/A case 6:
return (
"PTRACE_POKEUSER");
2N/A case 7:
return (
"PTRACE_CONT");
2N/A case 8:
return (
"PTRACE_KILL");
2N/A case 9:
return (
"PTRACE_SINGLESTEP");
2N/A if (
request == 0) {
/* PTRACE_TRACEME, executed by traced process */ 2N/A * Set stop-on-all-signals and nothing else. 2N/A * Turn off inherit-on-fork flag (grandchildren run away). 2N/A * Set ptrace-compatible flag. 2N/A !=
sizeof (
long)+
sizeof (
long))
2N/A !=
sizeof (
long)+
sizeof (
long))
2N/A /* find the cstatus structure corresponding to pid */ 2N/A * Process the request. 2N/A case 1:
/* PTRACE_PEEKTEXT */ 2N/A case 2:
/* PTRACE_PEEKDATA */ 2N/A case 3:
/* PTRACE_PEEKUSER */ 2N/A /* LINTED pointer alignment */ 2N/A case 4:
/* PTRACE_POKETEXT */ 2N/A case 5:
/* PTRACE_POKEDATA */ 2N/A case 6:
/* PTRACE_POKEUSER */ 2N/A case 7:
/* PTRACE_CONT */ 2N/A case 9:
/* PTRACE_SINGLESTEP */ 2N/A if (
addr !=
1 &&
/* new virtual address */ 2N/A /* make data the current signal */ 2N/A !=
3*
sizeof (
long)) {
2N/A /* current signal must have killed it */ 2N/A case 8:
/* PTRACE_KILL */ 2N/A * Find the cstatus structure corresponding to pid. 2N/A * Check every proc for existence, release those that are gone. 2N/A * Be careful about the linked list; ReleaseProc() changes it. 2N/A * Utility for OpenProc(). 2N/A * Make sure fd not one of 0, 1, or 2 to avoid stdio interference. 2N/A * Also, if dfd is greater than 2, dup fd to be exactly dfd. 2N/A * Mark filedescriptor close-on-exec. 2N/A * Should also be close-on-return-from-fork-in-child. 2N/A * Construct the /proc directory name: "/proc/<pid>" 2N/A * The name buffer passed by the caller must be large enough. 2N/A * Use exclusive-open only if this is the first open. 2N/A * Close the /proc/<pid> files. 2N/A * Take control of a child process. 2N/A ==
2*
sizeof (
long)) {
2N/A * Close the /proc/<pid> file, if open. 2N/A * Deallocate the memory used by the cstatus_t structure. 2N/A * Update process information from /proc. 2N/A * Return 0 on success, -1 on failure. 2N/A /* attempt to regain control */ 2N/A * Manufacture the contents of the fake u-block. 2N/A * Fetch the contents of u_psargs[]. 2N/A * Fetch the contents of u_signal[].