OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [rtos/] [ecos-3.0/] [packages/] [services/] [objloader/] [current/] [src/] [relocate_ppc.c] - Blame information for rev 786

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 786 skrzyp
/* =================================================================
2
 *
3
 *      relocate_ppc.c
4
 *
5
 *      Relocation types for the PowerPC processor.
6
 *
7
 * =================================================================
8
 * ####ECOSGPLCOPYRIGHTBEGIN####
9
 * -------------------------------------------
10
 * This file is part of eCos, the Embedded Configurable Operating System.
11
 * Copyright (C) 2005, 2008, 2009 Free Software Foundation, Inc.
12
 *
13
 * eCos is free software; you can redistribute it and/or modify it under
14
 * the terms of the GNU General Public License as published by the Free
15
 * Software Foundation; either version 2 or (at your option) any later
16
 * version.
17
 *
18
 * eCos is distributed in the hope that it will be useful, but WITHOUT
19
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
20
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
21
 * for more details.
22
 *
23
 * You should have received a copy of the GNU General Public License
24
 * along with eCos; if not, write to the Free Software Foundation, Inc.,
25
 * 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
26
 *
27
 * As a special exception, if other files instantiate templates or use
28
 * macros or inline functions from this file, or you compile this file
29
 * and link it with other works to produce a work based on this file,
30
 * this file does not by itself cause the resulting work to be covered by
31
 * the GNU General Public License. However the source code for this file
32
 * must still be made available in accordance with section (3) of the GNU
33
 * General Public License v2.
34
 *
35
 * This exception does not invalidate any other reasons why a work based
36
 * on this file might be covered by the GNU General Public License.
37
 * -------------------------------------------
38
 * ####ECOSGPLCOPYRIGHTEND####
39
 * =================================================================
40
 * #####DESCRIPTIONBEGIN####
41
 *
42
 *  Author(s):    Anthony Tonizzo (atonizzo@gmail.com)
43
 *  Date:         2005-05-13
44
 *  Purpose:
45
 *  Description:
46
 *
47
 * ####DESCRIPTIONEND####
48
 *
49
 * =================================================================
50
 */
51
 
52
#include <cyg/infra/diag.h>     // For diagnostic printing.
53
#include <stdlib.h>
54
#include <stdio.h>
55
#include <string.h>
56
 
57
#include <cyg/hal/hal_cache.h>
58
#include <cyg/hal/hal_io.h>
59
 
60
#include <pkgconf/objloader.h>
61
#include <cyg/objloader/elf.h>
62
#include <cyg/objloader/objelf.h>
63
 
64
#ifdef CYGPKG_HAL_POWERPC
65
void
66
cyg_ldr_flush_cache(void)
67
{
68
    HAL_DCACHE_SYNC();
69
    HAL_ICACHE_SYNC();
70
}
71
 
72
#if CYGPKG_SERVICES_OBJLOADER_DEBUG_LEVEL > 1
73
// Always 16 characters long, with blank padding is necessary, so
74
//  the printing is pretty. If the name is longer than 16, shorten it.
75
// We print the relocation symbols only is 
76
//  CYGPKG_SERVICES_OBJLOADER_DEBUG_LEVEL is set to 2.
77
char *relocation_name[] =
78
{
79
    "", "R_PPC_ADDR32    ", "", "", "R_PPC_ADDR16_LO ", "R_PPC_ADDR16_HI ",
80
    "R_PPC_ADDR16_HA ", "", "", "", "R_PPC_REL24     ", "", "", "", "", "",
81
    "", "", "", "", "R_PPC_REL32     "
82
};
83
#endif
84
 
85
// in:
86
// 
87
// sym_type  Type of relocation to apply,
88
// mem       Address in memory to modify (relocate).
89
// sym_value 
90
cyg_int32
91
cyg_ldr_relocate(cyg_int32 sym_type, cyg_uint32 mem, cyg_int32 sym_value)
92
{
93
    cyg_int32  rel_offset, i;
94
 
95
    // PPC uses rela, so we have to add the addend.
96
    switch(sym_type)
97
    {
98
    case R_PPC_ADDR16_HA:
99
        HAL_WRITE_UINT16(mem, _ha_(sym_value));
100
        return 0;
101
    case R_PPC_ADDR16_HI:
102
        HAL_WRITE_UINT16(mem, _hi_(sym_value));
103
        return 0;
104
    case R_PPC_ADDR16_LO:
105
        HAL_WRITE_UINT16(mem, _lo_(sym_value));
106
        return 0;
107
    case R_PPC_REL24:
108
        // Now it is time to seek the destination address of the call.
109
        // We need to do something in case the user jumps more than 16MB.
110
        rel_offset = (sym_value - mem) & 0x03FFFFFC;
111
        HAL_READ_UINT32(mem, i);
112
        i &= 0xFC000003;
113
        HAL_WRITE_UINT32(mem, rel_offset | i);
114
        return 0;
115
    case R_PPC_REL32:
116
        HAL_WRITE_UINT32(mem, (sym_value - mem));
117
        return 0;
118
    case R_PPC_ADDR32:
119
        HAL_WRITE_UINT32(mem, sym_value);
120
        return 0;
121
    default:
122
        ELFDEBUG("FIXME: Unknown relocation value!!!\n");
123
        return -1;
124
    }
125
}
126
#endif // CYGPKG_HAL_POWERPC
127
 
128
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.