19282254e29896366ea354b930b06f9defebbd041Petr Machata/* 29282254e29896366ea354b930b06f9defebbd041Petr Machata * This file is part of ltrace. 3693dfad9c1b121cf079a3082866daa2225df1797Petr Machata * Copyright (C) 2011,2012,2013 Petr Machata, Red Hat Inc. 49282254e29896366ea354b930b06f9defebbd041Petr Machata * 59282254e29896366ea354b930b06f9defebbd041Petr Machata * This program is free software; you can redistribute it and/or 69282254e29896366ea354b930b06f9defebbd041Petr Machata * modify it under the terms of the GNU General Public License as 79282254e29896366ea354b930b06f9defebbd041Petr Machata * published by the Free Software Foundation; either version 2 of the 89282254e29896366ea354b930b06f9defebbd041Petr Machata * License, or (at your option) any later version. 99282254e29896366ea354b930b06f9defebbd041Petr Machata * 109282254e29896366ea354b930b06f9defebbd041Petr Machata * This program is distributed in the hope that it will be useful, but 119282254e29896366ea354b930b06f9defebbd041Petr Machata * WITHOUT ANY WARRANTY; without even the implied warranty of 129282254e29896366ea354b930b06f9defebbd041Petr Machata * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 139282254e29896366ea354b930b06f9defebbd041Petr Machata * General Public License for more details. 149282254e29896366ea354b930b06f9defebbd041Petr Machata * 159282254e29896366ea354b930b06f9defebbd041Petr Machata * You should have received a copy of the GNU General Public License 169282254e29896366ea354b930b06f9defebbd041Petr Machata * along with this program; if not, write to the Free Software 179282254e29896366ea354b930b06f9defebbd041Petr Machata * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 189282254e29896366ea354b930b06f9defebbd041Petr Machata * 02110-1301 USA 199282254e29896366ea354b930b06f9defebbd041Petr Machata */ 209282254e29896366ea354b930b06f9defebbd041Petr Machata 219282254e29896366ea354b930b06f9defebbd041Petr Machata#ifndef _LTRACE_LINUX_TRACE_H_ 229282254e29896366ea354b930b06f9defebbd041Petr Machata#define _LTRACE_LINUX_TRACE_H_ 239282254e29896366ea354b930b06f9defebbd041Petr Machata 24ba1664b062414481d0f37d06bb01a19874c8d481Petr Machata#include "proc.h" 25ba1664b062414481d0f37d06bb01a19874c8d481Petr Machata 269282254e29896366ea354b930b06f9defebbd041Petr Machata/* This publishes some Linux-specific data structures used for process 279282254e29896366ea354b930b06f9defebbd041Petr Machata * handling. */ 289282254e29896366ea354b930b06f9defebbd041Petr Machata 299282254e29896366ea354b930b06f9defebbd041Petr Machata/** 309282254e29896366ea354b930b06f9defebbd041Petr Machata * This is used for bookkeeping related to PIDs that the event 319282254e29896366ea354b930b06f9defebbd041Petr Machata * handlers work with. 329282254e29896366ea354b930b06f9defebbd041Petr Machata */ 339282254e29896366ea354b930b06f9defebbd041Petr Machatastruct pid_task { 349282254e29896366ea354b930b06f9defebbd041Petr Machata pid_t pid; /* This may be 0 for tasks that exited 359282254e29896366ea354b930b06f9defebbd041Petr Machata * mid-handling. */ 369282254e29896366ea354b930b06f9defebbd041Petr Machata int sigstopped : 1; 379282254e29896366ea354b930b06f9defebbd041Petr Machata int got_event : 1; 389282254e29896366ea354b930b06f9defebbd041Petr Machata int delivered : 1; 399282254e29896366ea354b930b06f9defebbd041Petr Machata int vforked : 1; 409282254e29896366ea354b930b06f9defebbd041Petr Machata int sysret : 1; 419282254e29896366ea354b930b06f9defebbd041Petr Machata}; 429282254e29896366ea354b930b06f9defebbd041Petr Machata 439282254e29896366ea354b930b06f9defebbd041Petr Machatastruct pid_set { 449282254e29896366ea354b930b06f9defebbd041Petr Machata struct pid_task *tasks; 459282254e29896366ea354b930b06f9defebbd041Petr Machata size_t count; 469282254e29896366ea354b930b06f9defebbd041Petr Machata size_t alloc; 479282254e29896366ea354b930b06f9defebbd041Petr Machata}; 489282254e29896366ea354b930b06f9defebbd041Petr Machata 499282254e29896366ea354b930b06f9defebbd041Petr Machata/** 509282254e29896366ea354b930b06f9defebbd041Petr Machata * Breakpoint re-enablement. When we hit a breakpoint, we must 519282254e29896366ea354b930b06f9defebbd041Petr Machata * disable it, single-step, and re-enable it. That single-step can be 529282254e29896366ea354b930b06f9defebbd041Petr Machata * done only by one task in a task group, while others are stopped, 539282254e29896366ea354b930b06f9defebbd041Petr Machata * otherwise the processes would race for who sees the breakpoint 549282254e29896366ea354b930b06f9defebbd041Petr Machata * disabled and who doesn't. The following is to keep track of it 559282254e29896366ea354b930b06f9defebbd041Petr Machata * all. 569282254e29896366ea354b930b06f9defebbd041Petr Machata */ 579282254e29896366ea354b930b06f9defebbd041Petr Machatastruct process_stopping_handler 589282254e29896366ea354b930b06f9defebbd041Petr Machata{ 599282254e29896366ea354b930b06f9defebbd041Petr Machata struct event_handler super; 609282254e29896366ea354b930b06f9defebbd041Petr Machata 619282254e29896366ea354b930b06f9defebbd041Petr Machata /* The task that is doing the re-enablement. */ 62929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machata struct process *task_enabling_breakpoint; 639282254e29896366ea354b930b06f9defebbd041Petr Machata 649282254e29896366ea354b930b06f9defebbd041Petr Machata /* The pointer being re-enabled. */ 659282254e29896366ea354b930b06f9defebbd041Petr Machata struct breakpoint *breakpoint_being_enabled; 669282254e29896366ea354b930b06f9defebbd041Petr Machata 676e5e2de1728215679e83df6943c34573c1384e32Petr Machata /* Software singlestep breakpoints, if any needed. */ 686e5e2de1728215679e83df6943c34573c1384e32Petr Machata struct breakpoint *sws_bps[2]; 699282254e29896366ea354b930b06f9defebbd041Petr Machata 709282254e29896366ea354b930b06f9defebbd041Petr Machata /* When all tasks are stopped, this callback gets called. */ 719282254e29896366ea354b930b06f9defebbd041Petr Machata void (*on_all_stopped)(struct process_stopping_handler *); 729282254e29896366ea354b930b06f9defebbd041Petr Machata 7336f40e7d46838ec41ea03a2b9b748536d8fd57e2Petr Machata /* When we get a singlestep event, this is called to decide 7436f40e7d46838ec41ea03a2b9b748536d8fd57e2Petr Machata * whether to stop stepping, or whether to enable the 7536f40e7d46838ec41ea03a2b9b748536d8fd57e2Petr Machata * brakpoint, sink remaining signals, and continue 7636f40e7d46838ec41ea03a2b9b748536d8fd57e2Petr Machata * everyone. */ 7736f40e7d46838ec41ea03a2b9b748536d8fd57e2Petr Machata enum callback_status (*keep_stepping_p) 7836f40e7d46838ec41ea03a2b9b748536d8fd57e2Petr Machata (struct process_stopping_handler *); 7936f40e7d46838ec41ea03a2b9b748536d8fd57e2Petr Machata 80cb9a28da448439eab4bf554810fd1004fbc00885Petr Machata /* Whether we need to use ugly workaround to get around 81cb9a28da448439eab4bf554810fd1004fbc00885Petr Machata * various problems with singlestepping. */ 82cb9a28da448439eab4bf554810fd1004fbc00885Petr Machata enum callback_status (*ugly_workaround_p) 83cb9a28da448439eab4bf554810fd1004fbc00885Petr Machata (struct process_stopping_handler *); 84cb9a28da448439eab4bf554810fd1004fbc00885Petr Machata 859282254e29896366ea354b930b06f9defebbd041Petr Machata enum { 869282254e29896366ea354b930b06f9defebbd041Petr Machata /* We are waiting for everyone to land in t/T. */ 8796cb8e3111924780ed1d757e865a83f26421e616Petr Machata PSH_STOPPING = 0, 889282254e29896366ea354b930b06f9defebbd041Petr Machata 899282254e29896366ea354b930b06f9defebbd041Petr Machata /* We are doing the PTRACE_SINGLESTEP. */ 9096cb8e3111924780ed1d757e865a83f26421e616Petr Machata PSH_SINGLESTEP, 919282254e29896366ea354b930b06f9defebbd041Petr Machata 929282254e29896366ea354b930b06f9defebbd041Petr Machata /* We are waiting for all the SIGSTOPs to arrive so 939282254e29896366ea354b930b06f9defebbd041Petr Machata * that we can sink them. */ 9496cb8e3111924780ed1d757e865a83f26421e616Petr Machata PSH_SINKING, 959282254e29896366ea354b930b06f9defebbd041Petr Machata 969282254e29896366ea354b930b06f9defebbd041Petr Machata /* This is for tracking the ugly workaround. */ 9796cb8e3111924780ed1d757e865a83f26421e616Petr Machata PSH_UGLY_WORKAROUND, 989282254e29896366ea354b930b06f9defebbd041Petr Machata } state; 999282254e29896366ea354b930b06f9defebbd041Petr Machata 1009282254e29896366ea354b930b06f9defebbd041Petr Machata int exiting; 1019282254e29896366ea354b930b06f9defebbd041Petr Machata 1029282254e29896366ea354b930b06f9defebbd041Petr Machata struct pid_set pids; 1039282254e29896366ea354b930b06f9defebbd041Petr Machata}; 1049282254e29896366ea354b930b06f9defebbd041Petr Machata 1059282254e29896366ea354b930b06f9defebbd041Petr Machata/* Allocate a process stopping handler, initialize it and install it. 10636f40e7d46838ec41ea03a2b9b748536d8fd57e2Petr Machata * Return 0 on success or a negative value on failure. Pass NULL for 10736f40e7d46838ec41ea03a2b9b748536d8fd57e2Petr Machata * each callback to use a default instead. The default for 1081e2a4dd274ebb612e0cfa5c83ef081e5846aa949Petr Machata * ON_ALL_STOPPED is LINUX_PTRACE_DISABLE_AND_SINGLESTEP, the default 1091e2a4dd274ebb612e0cfa5c83ef081e5846aa949Petr Machata * for KEEP_STEPPING_P and UGLY_WORKAROUND_P is "no". */ 1109282254e29896366ea354b930b06f9defebbd041Petr Machataint process_install_stopping_handler 111929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machata (struct process *proc, struct breakpoint *sbp, 11236f40e7d46838ec41ea03a2b9b748536d8fd57e2Petr Machata void (*on_all_stopped)(struct process_stopping_handler *), 11336f40e7d46838ec41ea03a2b9b748536d8fd57e2Petr Machata enum callback_status (*keep_stepping_p) 114cb9a28da448439eab4bf554810fd1004fbc00885Petr Machata (struct process_stopping_handler *), 115cb9a28da448439eab4bf554810fd1004fbc00885Petr Machata enum callback_status (*ugly_workaround_p) 11636f40e7d46838ec41ea03a2b9b748536d8fd57e2Petr Machata (struct process_stopping_handler *)); 1179282254e29896366ea354b930b06f9defebbd041Petr Machata 1181e2a4dd274ebb612e0cfa5c83ef081e5846aa949Petr Machatavoid linux_ptrace_disable_and_singlestep(struct process_stopping_handler *self); 1191e2a4dd274ebb612e0cfa5c83ef081e5846aa949Petr Machatavoid linux_ptrace_disable_and_continue(struct process_stopping_handler *self); 1201e2a4dd274ebb612e0cfa5c83ef081e5846aa949Petr Machata 121b420a226cd2fc5d6028adcaf236c512a1f1fb437Petr Machata/* When main binary needs to call an IFUNC function defined in the 122b420a226cd2fc5d6028adcaf236c512a1f1fb437Petr Machata * binary itself, a PLT entry is set up so that dynamic linker can get 123b420a226cd2fc5d6028adcaf236c512a1f1fb437Petr Machata * involved and resolve the symbol. But unlike other PLT relocation, 124b420a226cd2fc5d6028adcaf236c512a1f1fb437Petr Machata * this one can't rely on symbol table being available. So it doesn't 125b420a226cd2fc5d6028adcaf236c512a1f1fb437Petr Machata * reference the symbol by its name, but by its address, and 126b420a226cd2fc5d6028adcaf236c512a1f1fb437Petr Machata * correspondingly, has another type. When arch backend wishes to 127b420a226cd2fc5d6028adcaf236c512a1f1fb437Petr Machata * support these IRELATIVE relocations, it should override 128b420a226cd2fc5d6028adcaf236c512a1f1fb437Petr Machata * arch_elf_add_plt_entry and dispatch to this function for IRELATIVE 129b420a226cd2fc5d6028adcaf236c512a1f1fb437Petr Machata * relocations. 130b420a226cd2fc5d6028adcaf236c512a1f1fb437Petr Machata * 131b420a226cd2fc5d6028adcaf236c512a1f1fb437Petr Machata * This function behaves as arch_elf_add_plt_entry, except that it 132b420a226cd2fc5d6028adcaf236c512a1f1fb437Petr Machata * doesn't take name for a parameter, but instead looks up the name in 133b420a226cd2fc5d6028adcaf236c512a1f1fb437Petr Machata * symbol tables in LTE. */ 134b420a226cd2fc5d6028adcaf236c512a1f1fb437Petr Machataenum plt_status linux_elf_add_plt_entry_irelative(struct process *proc, 135b420a226cd2fc5d6028adcaf236c512a1f1fb437Petr Machata struct ltelf *lte, 136b420a226cd2fc5d6028adcaf236c512a1f1fb437Petr Machata GElf_Rela *rela, size_t ndx, 137b420a226cd2fc5d6028adcaf236c512a1f1fb437Petr Machata struct library_symbol **ret); 138b420a226cd2fc5d6028adcaf236c512a1f1fb437Petr Machata 139b061bae322edd4894f14ea2aea6baec36d32eda8Petr Machata/* Service routine of the above. Determines a name corresponding to 14054bb64cf2eae7a0daa4d17e980b743b8ae69413bPetr Machata * ADDR, or invents a new one. Returns NULL on failures, otherwise it 141b061bae322edd4894f14ea2aea6baec36d32eda8Petr Machata * returns a malloc'd pointer that the caller is responsible for 142b061bae322edd4894f14ea2aea6baec36d32eda8Petr Machata * freeing. */ 14354bb64cf2eae7a0daa4d17e980b743b8ae69413bPetr Machatachar *linux_elf_find_irelative_name(struct ltelf *lte, GElf_Addr addr); 144b061bae322edd4894f14ea2aea6baec36d32eda8Petr Machata 145fa844db00b61b9f61c9ae8c6f4165aa5fff3a5d7Petr Machata/* Returns ${NAME}.IFUNC in a newly-malloc'd block, or NULL on 146fa844db00b61b9f61c9ae8c6f4165aa5fff3a5d7Petr Machata * failures. */ 147fa844db00b61b9f61c9ae8c6f4165aa5fff3a5d7Petr Machatachar *linux_append_IFUNC_to_name(const char *name); 148fa844db00b61b9f61c9ae8c6f4165aa5fff3a5d7Petr Machata 149fa844db00b61b9f61c9ae8c6f4165aa5fff3a5d7Petr Machata/* Returns a statically allocated prototype that represents the 150fa844db00b61b9f61c9ae8c6f4165aa5fff3a5d7Petr Machata * prototype "void *()". Never fails. */ 151fa844db00b61b9f61c9ae8c6f4165aa5fff3a5d7Petr Machatastruct prototype *linux_IFUNC_prototype(void); 152fa844db00b61b9f61c9ae8c6f4165aa5fff3a5d7Petr Machata 153fa844db00b61b9f61c9ae8c6f4165aa5fff3a5d7Petr Machata 1549282254e29896366ea354b930b06f9defebbd041Petr Machata#endif /* _LTRACE_LINUX_TRACE_H_ */ 155