view packages/services/objloader/current/src/loader_memory.c @ 2890:f8dd12428f1d

* cdl/objloader.cdl, src/objelf.c, src/relocate_ppc.c, src/relocate_arm.c: Eliminate dependency on CYGPKG_IO_FILEIO when the filesystem loader is not required. * src/relocate_arm.c : Added relocation software for the ARM . * src/relocate_i386.c : Added a structure containing the relocation names for every architecture. Only used (and compiled in) for pretty printing. * src/relocate_ppc.c : * include/relocate_arm.h : New header file for src/relocate_arm.c * cdl/objloader.cdl: Added the option to relocate for the ARM. * src/objloader.c : * src/objelf.c : Erased some redundant debug printout and improved the readability of the rest. * src/loader_memory.c : Added the code to allow the objloader package to load libraries from ROM memory, instead from a file system. The various sections of the library are the copied from ROM to RAM and relocated. * include/loader_memory.h : New header file for src/loader_memory.c * src/objloader.c : Added a line to include the loader_memory header file and code to flush the cache when calling cyg_ldr_find_symbol(). * cdl/objloader.cdl: Added one check boxe for each of the supported ways of loading libraries (two for now) so that the user can compile out the loading methods not used.
author jld
date Fri, 03 Jul 2009 14:49:44 +0000
parents
children
line wrap: on
line source

/* =================================================================
 *
 *      loader_memory.c
 *
 *      Routines to read a library from memory.
 *
 * ================================================================= 
 * ####ECOSGPLCOPYRIGHTBEGIN####
 * -------------------------------------------
 * This file is part of eCos, the Embedded Configurable Operating
 * System.
 * Copyright (C) 2006, 2008 Free Software Foundation, Inc.
 * 
 * eCos 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 2 or (at your option)
 * any later version.
 * 
 * eCos 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 eCos; if not, write to the Free Software Foundation,
 * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
 * 
 * As a special exception, if other files instantiate templates or
 * use macros or inline functions from this file, or you compile this
 * file and link it with other works to produce a work based on this
 * file, this file does not by itself cause the resulting work to be
 * covered by the GNU General Public License. However the source code
 * for this file must still be made available in accordance with
 * section (3) of the GNU General Public License.
 * 
 * This exception does not invalidate any other reasons why a work
 * based on this file might be covered by the GNU General Public
 * License.
 *
 * -------------------------------------------
 * ####ECOSGPLCOPYRIGHTEND####
 * =================================================================
 * #####DESCRIPTIONBEGIN####
 * 
 *  Author(s):    Gernot Zankl zankl@decomsys.com
 *  Contributors: 
 *  Date:         2006-11-21
 *  Purpose:      
 *  Description:  
 *               
 * ####DESCRIPTIONEND####
 * 
 * =================================================================
 */

#include <cyg/infra/diag.h>     // For diagnostic printing.
#include <cyg/infra/cyg_ass.h>  // CYG_ASSERT

#include <stdio.h>
#include <stdlib.h>

#include <pkgconf/objloader.h>
#include <cyg/objloader/elf.h>
#include <cyg/objloader/objelf.h>
#include <cyg/objloader/loader_memory.h>

typedef struct
{
    CYG_ADDRWORD nBufferBase;
    cyg_uint32   nOffset;
} ObjLoader_MemInfoType;

static size_t 
cyg_ldr_memory_read(PELF_OBJECT p, size_t s, size_t n, void *mem)
{
    ObjLoader_MemInfoType * const pMemInfo = (ObjLoader_MemInfoType *)p->ptr;

    cyg_uint8 * const pSource = 
        (cyg_uint8 *)pMemInfo->nBufferBase + pMemInfo->nOffset;

    memcpy(mem, (void*)pSource, s*n);
    return n;
}

static cyg_int32 
cyg_ldr_memory_seek(PELF_OBJECT p, cyg_uint32 offs)
{
    ObjLoader_MemInfoType * const pMemInfo = (ObjLoader_MemInfoType *)p->ptr;
    pMemInfo->nOffset = offs;
    return 0;
}

static cyg_int32 
cyg_ldr_memory_close(PELF_OBJECT p)
{
    return 0;
}

PELF_OBJECT
cyg_ldr_open_library_memory(CYG_ADDRWORD ptr)
{
    PELF_OBJECT  e_obj; 
    ObjLoader_MemInfoType * pMemInfo;

    if (ptr == 0)
    {
        cyg_ldr_last_error = "ERROR INVALID POINTER";
        return (void*)0;
    }
    
    // Create a file object to keep track of this library.
    e_obj = (PELF_OBJECT)malloc(sizeof(ELF_OBJECT));
    CYG_ASSERT(e_obj != 0, "Cannot malloc() e_obj");
    if (e_obj == 0)
    {
        cyg_ldr_last_error = "ERROR IN MALLOC";
        return (void*)0;
    }
    memset(e_obj, 0, sizeof(ELF_OBJECT));

    pMemInfo = (ObjLoader_MemInfoType *)malloc(sizeof(ObjLoader_MemInfoType));
    CYG_ASSERT(pMemInfo != 0, "Cannot malloc() pMemInfo");
    if (pMemInfo == 0)
    {
        cyg_ldr_last_error = "ERROR IN MALLOC";
        return (void*)0;
    }

    pMemInfo->nBufferBase = ptr;
    pMemInfo->nOffset = 0;

    e_obj->ptr   = (CYG_ADDRWORD)pMemInfo;
    e_obj->mode  = CYG_LDR_MODE_MEMORY;

    // Handlers for the file system open.
    e_obj->read  = cyg_ldr_memory_read;
    e_obj->seek  = cyg_ldr_memory_seek;
    e_obj->close = cyg_ldr_memory_close;
    return e_obj;
}

void
cyg_ldr_close_library_memory(PELF_OBJECT p)
{
    free((ObjLoader_MemInfoType *) p->ptr);
}