/* Chrysalide - Outil d'analyse de fichiers binaires
* helpers_arm64.c - compléments utiles à GDB pour l'architecture AArch64
*
* Copyright (C) 2016 Cyrille Bagard
*
* This file is part of Chrysalide.
*
* Chrysalide is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* Chrysalide is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Chrysalide. If not, see .
*/
#include "helpers_arm64.h"
#include
#include "gdb-int.h"
/******************************************************************************
* *
* Paramètres : debugger = débogueur à consulter. *
* callstack = pile d'appels reconstituée. [OUT] *
* size = taille de cette pile. [OUT] *
* *
* Description : Remonte la pile d'appels jusqu'au point courant. *
* *
* Retour : Bilan de l'opération. *
* *
* Remarques : - *
* *
******************************************************************************/
bool compute_call_stack_for_arm64(GGdbDebugger *debugger, virt_t **callstack, size_t *size)
{
bool result; /* Bilan global à retourner */
GBinaryDebugger *base; /* Version basique d'instance */
uint64_t fp; /* Pointeur de cadre à suivre */
uint64_t previous; /* Appel de fonction précédent */
base = G_BINARY_DEBUGGER(debugger);
result = g_binary_debugger_read_register_u64(base, "x29", &fp);
while (result && fp != 0)
{
result = g_binary_debugger_read_memory_u64(base, fp + sizeof(uint64_t), &previous);
if (!result) break;
*callstack = (virt_t *)realloc(*callstack, ++(*size) * sizeof(virt_t));
(*callstack)[*size - 1] = previous;
result = g_binary_debugger_read_memory_u64(base, fp, &fp);
}
return result;
}
/******************************************************************************
* *
* Paramètres : debugger = débogueur à manipuler ici. *
* addr = emplacement du point mémoire à traiter. *
* cmd = commande en cours de constitution. [OUT] *
* *
* Description : Complète la commande manipulant des points d'arrêt. *
* *
* Retour : Bilan de l'opération. *
* *
* Remarques : - *
* *
******************************************************************************/
bool fill_memory_breakpoint_cmd_for_arm64(GGdbDebugger *debugger, virt_t addr, char *cmd)
{
strcat(cmd, ",4");
return true;
}