/* OpenIDA - Outil d'analyse de fichiers binaires
 * processor.c - manipulation du processeur ARM
 *
 * Copyright (C) 2010 Cyrille Bagard
 *
 *  This file is part of OpenIDA.
 *
 *  OpenIDA 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.
 *
 *  OpenIDA 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 Foobar.  If not, see <http://www.gnu.org/licenses/>.
 */


#include "processor.h"


//#include "instruction.h"
//#include "opcodes.h"
#include "../processor-int.h"



/* Définition du processeur ARM (instance) */
struct _GArmProcessor
{
    GArchProcessor parent;                  /* Instance parente            */

};


/* Définition du processeur ARM (classe) */
struct _GArmProcessorClass
{
    GArchProcessorClass parent;             /* Classe parente              */

};


/* Initialise la classe des processeurs ARM. */
static void g_arm_processor_class_init(GArmProcessorClass *);

/* Initialise une instance de processeur ARM. */
static void g_arm_processor_init(GArmProcessor *);

/* Décode une instruction dans un flux de données. */
static GArchInstruction *g_arm_processor_decode_instruction(const GArmProcessor *, const bin_t *, off_t *, off_t, vmpa_t);


/* Indique le type défini par la GLib pour le processeur ARM. */
G_DEFINE_TYPE(GArmProcessor, g_arm_processor, G_TYPE_ARCH_PROCESSOR);



/******************************************************************************
*                                                                             *
*  Paramètres  : klass = classe à initialiser.                                *
*                                                                             *
*  Description : Initialise la classe des processeurs ARM.                    *
*                                                                             *
*  Retour      : -                                                            *
*                                                                             *
*  Remarques   : -                                                            *
*                                                                             *
******************************************************************************/

static void g_arm_processor_class_init(GArmProcessorClass *klass)
{

}


/******************************************************************************
*                                                                             *
*  Paramètres  : proc = instance à initialiser.                               *
*                                                                             *
*  Description : Initialise une instance de processeur ARM.                   *
*                                                                             *
*  Retour      : -                                                            *
*                                                                             *
*  Remarques   : -                                                            *
*                                                                             *
******************************************************************************/

static void g_arm_processor_init(GArmProcessor *proc)
{
    GArchProcessor *parent;                 /* Instance parente            */

    parent = G_ARCH_PROCESSOR(proc);

    parent->endianness = SRE_LITTLE;
    parent->memsize = MDS_32_BITS;
    parent->inssize = MDS_32_BITS;

    parent->decode = (decode_instruction_fc)g_arm_processor_decode_instruction;

}


/******************************************************************************
*                                                                             *
*  Paramètres  : -                                                            *
*                                                                             *
*  Description : Crée le support de l'architecture ARM.                       *
*                                                                             *
*  Retour      : Architecture mise en place.                                  *
*                                                                             *
*  Remarques   : -                                                            *
*                                                                             *
******************************************************************************/

GArchProcessor *g_arm_processor_new(void)
{
    GArchProcessor *result;                 /* Structure à retourner       */

    result = g_object_new(G_TYPE_ARM_PROCESSOR, NULL);

    return result;

}


/******************************************************************************
*                                                                             *
*  Paramètres  : proc = architecture visée par la procédure.                  *
*                data = flux de données à analyser.                           *
*                pos  = position courante dans ce flux. [OUT]                 *
*                len  = taille totale des données à analyser.                 *
*                addr = adresse virtuelle de l'instruction.                   *
*                                                                             *
*  Description : Décode une instruction dans un flux de données.              *
*                                                                             *
*  Retour      : Instruction mise en place.                                   *
*                                                                             *
*  Remarques   : -                                                            *
*                                                                             *
******************************************************************************/

static GArchInstruction *g_arm_processor_decode_instruction(const GArmProcessor *proc, const bin_t *data, off_t *pos, off_t len, vmpa_t addr)
{
    GArchInstruction *result;               /* Instruction à renvoyer      */


    result = NULL;


    return result;

}