Contiki 2.6

elfloader-arch.h

Go to the documentation of this file.
00001 /*
00002  * Copyright (c) 2005, Swedish Institute of Computer Science
00003  * All rights reserved.
00004  *
00005  * Redistribution and use in source and binary forms, with or without
00006  * modification, are permitted provided that the following conditions
00007  * are met:
00008  * 1. Redistributions of source code must retain the above copyright
00009  *    notice, this list of conditions and the following disclaimer.
00010  * 2. Redistributions in binary form must reproduce the above copyright
00011  *    notice, this list of conditions and the following disclaimer in the
00012  *    documentation and/or other materials provided with the distribution.
00013  * 3. Neither the name of the Institute nor the names of its contributors
00014  *    may be used to endorse or promote products derived from this software
00015  *    without specific prior written permission.
00016  *
00017  * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
00018  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00019  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
00020  * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
00021  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
00022  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
00023  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
00024  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
00025  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
00026  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
00027  * SUCH DAMAGE.
00028  *
00029  * This file is part of the Contiki operating system.
00030  *
00031  * @(#)$Id: elfloader-arch.h,v 1.4 2007/03/24 15:21:34 oliverschmidt Exp $
00032  */
00033 /**
00034  * \addtogroup elfloader
00035  * @{
00036  */
00037 
00038 /**
00039  * \defgroup elfloaderarch Architecture specific functionality for the ELF loader.
00040  *
00041  * The architecture specific functionality for the Contiki ELF loader
00042  * has to be implemented for each processor type Contiki runs on.
00043  *
00044  * Since the ELF format is slightly different for different processor
00045  * types, the Contiki ELF loader is divided into two parts: the
00046  * generic ELF loader module (\ref elfloader) and the architecture
00047  * specific part (this module). The architecture specific part deals
00048  * with memory allocation, code and data relocation, and writing the
00049  * relocated ELF code into program memory.
00050  *
00051  * To port the Contiki ELF loader to a new processor type, this module
00052  * has to be implemented for the new processor type.
00053  *
00054  * @{
00055  */
00056 
00057 /**
00058  * \file
00059  *         Header file for the architecture specific parts of the Contiki ELF loader.
00060  *
00061  * \author
00062  *         Adam Dunkels <adam@sics.se>
00063  *
00064  */
00065 
00066 #ifndef __ELFLOADER_ARCH_H__
00067 #define __ELFLOADER_ARCH_H__
00068 
00069 #include "loader/elfloader.h"
00070 
00071 /**
00072  * \brief      Allocate RAM for a new module.
00073  * \param size The size of the requested memory.
00074  * \return     A pointer to the allocated RAM
00075  *
00076  *             This function is called from the Contiki ELF loader to
00077  *             allocate RAM for the module to be loaded into.
00078  *
00079  * \bug        The Contiki ELF loader currently does not contain a
00080  *             mechanism for deallocating the memory allocated with
00081  *             this function.
00082  */
00083 void *elfloader_arch_allocate_ram(int size);
00084 
00085 /**
00086  * \brief      Allocate program memory for a new module.
00087  * \param size The size of the requested memory.
00088  * \return     A pointer to the allocated program memory
00089  *
00090  *             This function is called from the Contiki ELF loader to
00091  *             allocate program memory (typically ROM) for the module
00092  *             to be loaded into.
00093  *
00094  * \bug        The Contiki ELF loader currently does not contain a
00095  *             mechanism for deallocating the memory allocated with
00096  *             this function.
00097  */
00098 void *elfloader_arch_allocate_rom(int size);
00099 
00100 /**
00101  * \brief      Perform a relocation.
00102  * \param fd   The file descriptor for the ELF file.
00103  * \param sectionoffset The file offset at which the relocation can be found.
00104  * \param sectionaddr The section start address (absolute runtime).
00105  * \param rela A pointer to an ELF32 rela structure (struct elf32_rela).
00106  * \param addr The relocated address.
00107  *
00108  *             This function is called from the Contiki ELF loader to
00109  *             perform a relocation on a piece of code or data. The
00110  *             relocated address is calculated by the Contiki ELF
00111  *             loader, based on information in the ELF file, and it is
00112  *             the responsibility of this function to patch the
00113  *             executable code. The Contiki ELF loader passes a
00114  *             pointer to an ELF32 rela structure (struct elf32_rela)
00115  *             that contains information about how to patch the
00116  *             code. This information is different from processor to
00117  *             processor.
00118  */
00119 void elfloader_arch_relocate(int fd, unsigned int sectionoffset,
00120                              char *sectionaddr,
00121                              struct elf32_rela *rela, char *addr);
00122 
00123 /**
00124  * \brief      Write to read-only memory (for example the text segment).
00125  * \param fd   The file descriptor for the ELF file.
00126  * \param textoff       Offset of text segment relative start of file.
00127  * \param size The size of the text segment.
00128  * \param mem  A pointer to the where the text segment should be flashed
00129  *
00130  *             This function is called from the Contiki ELF loader to
00131  *             write the program code (text segment) of a loaded
00132  *             module into memory. The function is called when all
00133  *             relocations have been performed.
00134  */
00135 void elfloader_arch_write_rom(int fd, unsigned short textoff, unsigned int size, char *mem);
00136 
00137 #endif /* __ELFLOADER_ARCH_H__ */
00138 
00139 /** @} */
00140 /** @} */