trace.c revision 929bd57ca202fd2f2e8485ebf65d683e664f67b5
1b1dd77d66f93eeaa6cbf8b101d3e9cf70981e000Juan Cespedes/* 2917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata * This file is part of ltrace. 3917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata * Copyright (C) 2012 Petr Machata, Red Hat Inc. 4917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata * Copyright (C) 2001,2005 IBM Corp. 5917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata * 6917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata * This program is free software; you can redistribute it and/or 7917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata * modify it under the terms of the GNU General Public License as 8917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata * published by the Free Software Foundation; either version 2 of the 9917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata * License, or (at your option) any later version. 10917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata * 11917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata * This program is distributed in the hope that it will be useful, but 12917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata * WITHOUT ANY WARRANTY; without even the implied warranty of 13917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata * General Public License for more details. 15917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata * 16917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata * You should have received a copy of the GNU General Public License 17917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata * along with this program; if not, write to the Free Software 18917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 19917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata * 02110-1301 USA 20917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata */ 21b1dd77d66f93eeaa6cbf8b101d3e9cf70981e000Juan Cespedes 22b1dd77d66f93eeaa6cbf8b101d3e9cf70981e000Juan Cespedes#include "config.h" 23b1dd77d66f93eeaa6cbf8b101d3e9cf70981e000Juan Cespedes 24917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata#include <asm/ptrace.h> 25917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata#include <sys/ptrace.h> 26b1dd77d66f93eeaa6cbf8b101d3e9cf70981e000Juan Cespedes#include <sys/types.h> 27b1dd77d66f93eeaa6cbf8b101d3e9cf70981e000Juan Cespedes#include <sys/wait.h> 28917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata#include <assert.h> 29917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata#include <errno.h> 30b1dd77d66f93eeaa6cbf8b101d3e9cf70981e000Juan Cespedes#include <signal.h> 31917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata#include <stdlib.h> 32b1dd77d66f93eeaa6cbf8b101d3e9cf70981e000Juan Cespedes 33f728123bd75a65a6a1536e198c3c30719e494e71Juan Cespedes#include "common.h" 34917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata#include "proc.h" 35917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata#include "type.h" 36b1dd77d66f93eeaa6cbf8b101d3e9cf70981e000Juan Cespedes 37b1dd77d66f93eeaa6cbf8b101d3e9cf70981e000Juan Cespedes#if (!defined(PTRACE_PEEKUSER) && defined(PTRACE_PEEKUSR)) 38b1dd77d66f93eeaa6cbf8b101d3e9cf70981e000Juan Cespedes# define PTRACE_PEEKUSER PTRACE_PEEKUSR 39b1dd77d66f93eeaa6cbf8b101d3e9cf70981e000Juan Cespedes#endif 40b1dd77d66f93eeaa6cbf8b101d3e9cf70981e000Juan Cespedes 41b1dd77d66f93eeaa6cbf8b101d3e9cf70981e000Juan Cespedes#if (!defined(PTRACE_POKEUSER) && defined(PTRACE_POKEUSR)) 42b1dd77d66f93eeaa6cbf8b101d3e9cf70981e000Juan Cespedes# define PTRACE_POKEUSER PTRACE_POKEUSR 43b1dd77d66f93eeaa6cbf8b101d3e9cf70981e000Juan Cespedes#endif 44b1dd77d66f93eeaa6cbf8b101d3e9cf70981e000Juan Cespedes 45f13505251e6402460f6cc7ec84e0d8ca91607b4fJuan Cespedesvoid 46929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machataget_arch_dep(struct process *proc) 47929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machata{ 489a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand#ifdef __s390x__ 499a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand unsigned long psw; 509a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand 519a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand if (proc->arch_ptr) 529a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand return; 539a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand 549a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand psw = ptrace(PTRACE_PEEKUSER, proc->pid, PT_PSWMASK, 0); 559a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand 569a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand if ((psw & 0x000000180000000) == 0x000000080000000) { 579a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand proc->mask_32bit = 1; 589a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand proc->personality = 1; 599a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand } 609a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand 612d45b1a8e26a36a9f85dc49e721c4390ca93dc40Ian Wienand proc->arch_ptr = (void *)1; 629a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand#endif 635c3fe0697b202cc7d95e90459de0fb312b297b27Juan Cespedes} 645c3fe0697b202cc7d95e90459de0fb312b297b27Juan Cespedes 65b1dd77d66f93eeaa6cbf8b101d3e9cf70981e000Juan Cespedes/* Returns 1 if syscall, 2 if sysret, 0 otherwise. 66b1dd77d66f93eeaa6cbf8b101d3e9cf70981e000Juan Cespedes */ 67f13505251e6402460f6cc7ec84e0d8ca91607b4fJuan Cespedesint 68929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machatasyscall_p(struct process *proc, int status, int *sysnum) 69929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machata{ 709a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand long pc, opcode, offset_reg, scno, tmp; 719a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand void *svc_addr; 722d45b1a8e26a36a9f85dc49e721c4390ca93dc40Ian Wienand int gpr_offset[16] = { PT_GPR0, PT_GPR1, PT_ORIGGPR2, PT_GPR3, 732d45b1a8e26a36a9f85dc49e721c4390ca93dc40Ian Wienand PT_GPR4, PT_GPR5, PT_GPR6, PT_GPR7, 742d45b1a8e26a36a9f85dc49e721c4390ca93dc40Ian Wienand PT_GPR8, PT_GPR9, PT_GPR10, PT_GPR11, 752d45b1a8e26a36a9f85dc49e721c4390ca93dc40Ian Wienand PT_GPR12, PT_GPR13, PT_GPR14, PT_GPR15 762d45b1a8e26a36a9f85dc49e721c4390ca93dc40Ian Wienand }; 77b1dd77d66f93eeaa6cbf8b101d3e9cf70981e000Juan Cespedes 782d45b1a8e26a36a9f85dc49e721c4390ca93dc40Ian Wienand if (WIFSTOPPED(status) 792d45b1a8e26a36a9f85dc49e721c4390ca93dc40Ian Wienand && WSTOPSIG(status) == (SIGTRAP | proc->tracesysgood)) { 80b1dd77d66f93eeaa6cbf8b101d3e9cf70981e000Juan Cespedes 819a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand /* 829a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand * If we have PTRACE_O_TRACESYSGOOD and we have the new style 839a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand * of passing the system call number to user space via PT_GPR2 849a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand * then the task is quite easy. 859a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand */ 86b1dd77d66f93eeaa6cbf8b101d3e9cf70981e000Juan Cespedes 879a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand *sysnum = ptrace(PTRACE_PEEKUSER, proc->pid, PT_GPR2, 0); 88b1dd77d66f93eeaa6cbf8b101d3e9cf70981e000Juan Cespedes 899a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand if (proc->tracesysgood) { 90b1dd77d66f93eeaa6cbf8b101d3e9cf70981e000Juan Cespedes /* System call was encountered... */ 918f8282f72eaeadc5419cd5470100e8dcaba5b7fdJuan Cespedes if (proc->callstack_depth > 0 && 922d45b1a8e26a36a9f85dc49e721c4390ca93dc40Ian Wienand proc->callstack[proc->callstack_depth - 932d45b1a8e26a36a9f85dc49e721c4390ca93dc40Ian Wienand 1].is_syscall) { 949a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand /* syscall exit */ 952d45b1a8e26a36a9f85dc49e721c4390ca93dc40Ian Wienand *sysnum = 962d45b1a8e26a36a9f85dc49e721c4390ca93dc40Ian Wienand proc->callstack[proc->callstack_depth - 972d45b1a8e26a36a9f85dc49e721c4390ca93dc40Ian Wienand 1].c_un.syscall; 98b1dd77d66f93eeaa6cbf8b101d3e9cf70981e000Juan Cespedes return 2; 998f8282f72eaeadc5419cd5470100e8dcaba5b7fdJuan Cespedes } else { 1009a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand /* syscall enter */ 1019a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand if (*sysnum != -ENOSYS) 1029a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand return 1; 103b1dd77d66f93eeaa6cbf8b101d3e9cf70981e000Juan Cespedes } 1049a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand } 1052d45b1a8e26a36a9f85dc49e721c4390ca93dc40Ian Wienand 1069a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand /* 1079a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand * At least one of the two requirements mentioned above is not 1089a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand * met. Therefore the fun part starts here: 1099a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand * We try to do some instruction decoding without even knowing 1109a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand * the instruction code length of the last instruction executed. 1119a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand * Needs to be done to get the system call number or to decide 1129a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand * if we reached a breakpoint or even checking for a completely 1139a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand * unrelated instruction. 1149a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand * Just a heuristic that most of the time appears to work... 1159a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand */ 1169a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand 1179a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand pc = ptrace(PTRACE_PEEKUSER, proc->pid, PT_PSWADDR, 0); 1189a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand opcode = ptrace(PTRACE_PEEKTEXT, proc->pid, 1192d45b1a8e26a36a9f85dc49e721c4390ca93dc40Ian Wienand (char *)(pc - sizeof(long)), 0); 1209a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand 1219a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand if ((opcode & 0xffff) == 0x0001) { 1229a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand /* Breakpoint */ 123b1dd77d66f93eeaa6cbf8b101d3e9cf70981e000Juan Cespedes return 0; 1242d45b1a8e26a36a9f85dc49e721c4390ca93dc40Ian Wienand } else if ((opcode & 0xff00) == 0x0a00) { 1259a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand /* SVC opcode */ 1269a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand scno = opcode & 0xff; 1272d45b1a8e26a36a9f85dc49e721c4390ca93dc40Ian Wienand } else if ((opcode & 0xff000000) == 0x44000000) { 1289a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand /* Instruction decoding of EXECUTE... */ 1292d45b1a8e26a36a9f85dc49e721c4390ca93dc40Ian Wienand svc_addr = (void *)(opcode & 0xfff); 1309a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand 1319a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand offset_reg = (opcode & 0x000f0000) >> 16; 1329a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand if (offset_reg) 1339a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand svc_addr += ptrace(PTRACE_PEEKUSER, proc->pid, 1349a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand gpr_offset[offset_reg], 0); 1359a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand 1369a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand offset_reg = (opcode & 0x0000f000) >> 12; 1379a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand if (offset_reg) 1389a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand svc_addr += ptrace(PTRACE_PEEKUSER, proc->pid, 1399a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand gpr_offset[offset_reg], 0); 1409a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand 1419a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand scno = ptrace(PTRACE_PEEKTEXT, proc->pid, svc_addr, 0); 1429a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand#ifdef __s390x__ 1439a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand scno >>= 48; 1449a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand#else 1459a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand scno >>= 16; 1469a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand#endif 1479a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand if ((scno & 0xff00) != 0x0a000) 1489a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand return 0; 1499a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand 1509a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand tmp = 0; 1519a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand offset_reg = (opcode & 0x00f00000) >> 20; 1529a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand if (offset_reg) 1539a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand tmp = ptrace(PTRACE_PEEKUSER, proc->pid, 1549a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand gpr_offset[offset_reg], 0); 1559a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand 1569a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand scno = (scno | tmp) & 0xff; 1572d45b1a8e26a36a9f85dc49e721c4390ca93dc40Ian Wienand } else { 1589a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand /* No opcode related to syscall handling */ 1599a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand return 0; 1609a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand } 1619a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand 1629a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand if (scno == 0) 1639a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand scno = ptrace(PTRACE_PEEKUSER, proc->pid, PT_GPR1, 0); 1649a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand 1659a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand *sysnum = scno; 1669a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand 1679a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand /* System call was encountered... */ 1689a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand if (proc->callstack_depth > 0 && 1692d45b1a8e26a36a9f85dc49e721c4390ca93dc40Ian Wienand proc->callstack[proc->callstack_depth - 1].is_syscall) { 1709a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand return 2; 1719a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand } else { 1729a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand return 1; 1739a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand } 174b1dd77d66f93eeaa6cbf8b101d3e9cf70981e000Juan Cespedes } 175b1dd77d66f93eeaa6cbf8b101d3e9cf70981e000Juan Cespedes /* Unknown status... */ 176b1dd77d66f93eeaa6cbf8b101d3e9cf70981e000Juan Cespedes return 0; 177b1dd77d66f93eeaa6cbf8b101d3e9cf70981e000Juan Cespedes} 178b1dd77d66f93eeaa6cbf8b101d3e9cf70981e000Juan Cespedes 179917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machatasize_t 180929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machataarch_type_sizeof(struct process *proc, struct arg_type_info *info) 181917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata{ 182917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata if (proc == NULL) 183917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata return (size_t)-2; 184917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata 185917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata switch (info->type) { 186917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata case ARGTYPE_VOID: 187917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata return 0; 188917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata 189917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata case ARGTYPE_CHAR: 190917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata return 1; 191917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata 192917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata case ARGTYPE_SHORT: 193917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata case ARGTYPE_USHORT: 194917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata return 2; 195917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata 196917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata case ARGTYPE_INT: 197917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata case ARGTYPE_UINT: 198917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata return 4; 199917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata 200917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata case ARGTYPE_LONG: 201917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata case ARGTYPE_ULONG: 202917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata case ARGTYPE_POINTER: 203917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata return proc->e_class == ELFCLASS64 ? 8 : 4; 204917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata 205917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata case ARGTYPE_FLOAT: 206917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata return 4; 207917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata case ARGTYPE_DOUBLE: 208917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata return 8; 209917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata 210917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata case ARGTYPE_ARRAY: 211917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata case ARGTYPE_STRUCT: 212917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata /* Use default value. */ 213917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata return (size_t)-2; 2145b5c256d0e9076e745908a43acc46353265a5608Edgar E. Iglesias 2155b5c256d0e9076e745908a43acc46353265a5608Edgar E. Iglesias default: 2165b5c256d0e9076e745908a43acc46353265a5608Edgar E. Iglesias assert(info->type != info->type); 2175b5c256d0e9076e745908a43acc46353265a5608Edgar E. Iglesias abort(); 218917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata } 219917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata} 220917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata 221917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machatasize_t 222929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machataarch_type_alignof(struct process *proc, struct arg_type_info *info) 223917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata{ 224917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata if (proc == NULL) 225917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata return (size_t)-2; 226917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata 227917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata switch (info->type) { 2285b5c256d0e9076e745908a43acc46353265a5608Edgar E. Iglesias default: 2295b5c256d0e9076e745908a43acc46353265a5608Edgar E. Iglesias assert(info->type != info->type); 230917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata break; 231917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata 232917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata case ARGTYPE_CHAR: 233917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata return 1; 234917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata 235917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata case ARGTYPE_SHORT: 236917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata case ARGTYPE_USHORT: 237917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata return 2; 238917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata 239917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata case ARGTYPE_INT: 240917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata case ARGTYPE_UINT: 241917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata return 4; 242917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata 243917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata case ARGTYPE_LONG: 244917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata case ARGTYPE_ULONG: 245917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata case ARGTYPE_POINTER: 246917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata return proc->e_class == ELFCLASS64 ? 8 : 4; 247917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata 248917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata case ARGTYPE_FLOAT: 249917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata return 4; 250917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata case ARGTYPE_DOUBLE: 251917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata return 8; 252917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata 253917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata case ARGTYPE_ARRAY: 254917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata case ARGTYPE_STRUCT: 255917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata /* Use default value. */ 256917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata return (size_t)-2; 257917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata } 258917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata abort(); 259917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata} 260