summaryrefslogtreecommitdiff
path: root/drivers/staging/nmf-cm/cm/engine/elf/src/elfrelocate.c
blob: b08ac6a361e02720daaec5df85784c71b288be1d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
/*
 * Copyright (C) ST-Ericsson SA 2010
 * Author: Jean-Philippe FASSINO <jean-philippe.fassino@stericsson.com> for ST-Ericsson.
 * License terms: GNU General Public License (GPL) version 2.
 */
/*
 *
 */
#include <cm/engine/elf/inc/bfd.h>
#include <cm/engine/elf/inc/mpcal.h>
#include <cm/engine/trace/inc/trace.h>
#include <cm/engine/utils/inc/string.h>

t_cm_error cm_ELF_relocateSharedSegments(
        t_memory_handle *memories,
        t_elfdescription *elfhandle,
        void                        *cbContext)
{
    return ELF64_relocateSegments(
        memories,
        elfhandle,
        MEM_SHARABLE,
        cbContext);
}

t_cm_error cm_ELF_relocatePrivateSegments(
        t_memory_handle *memories,
        t_elfdescription *elfhandle,
        void                        *cbContext)
{
    return ELF64_relocateSegments(
        memories,
        elfhandle,
        MEM_PRIVATE,
        cbContext);
}

void cm_ELF_performRelocation(
        t_uint32 type,
        const char* symbol_name,
        t_uint32 symbol_addr,
        char* reloc_addr)
{
    MMDSP_performRelocation(
                        type,
                        symbol_name,
                        symbol_addr,
                        reloc_addr,
                        reloc_addr,
                        0xBEEF);

    OSAL_CleanDCache((t_uint32)reloc_addr, 8);
}

t_cm_error cm_ELF_GetMemory(
        t_elfdescription            *elf,
        t_tmp_elfdescription        *elftmp,
        t_uint32                    address,
        t_memory_purpose            purpose,
        t_memory_reference          *memory) {
    t_memory_id memId;

    for(memId = 0; memId < NUMBER_OF_MMDSP_MEMORY; memId++)
    {
        const t_elfmemory* mem = MMDSP_getMappingById(memId);

        if(mem->purpose == purpose &&    // Memory correspond
                elf->segments[mem->id].sumSize != 0 && // Segment allocated
                (elf->segments[mem->id].mpcAddr <= address) &&
                (address < elf->segments[mem->id].mpcAddr + elf->segments[mem->id].sumSize / mem->fileEntSize)) {
            memory->memory = mem;
            memory->offset = address - elf->segments[mem->id].mpcAddr;
            return CM_OK;
        }
    }

    ERROR("Memory %x,%d not found\n", address, purpose, 0, 0, 0, 0);
    return CM_INVALID_ELF_FILE;
}