/* * tramp_table_c6000.c * * DSP-BIOS Bridge driver support functions for TI OMAP processors. * * Copyright (C) 2005-2006 Texas Instruments, Inc. * * This package is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #include "dload_internal.h" /* These are defined in coff.h, but may not be available on all platforms so we'll go ahead and define them here. */ #ifndef R_C60LO16 #define R_C60LO16 0x54 /* C60: MVK Low Half Register */ #define R_C60HI16 0x55 /* C60: MVKH/MVKLH High Half Register */ #endif #define C6X_TRAMP_WORD_COUNT 8 #define C6X_TRAMP_MAX_RELOS 8 /* THIS HASH FUNCTION MUST MATCH THE ONE reloc_table_c6000.c */ #define HASH_FUNC(zz) (((((zz) + 1) * 1845UL) >> 11) & 63) /* THIS MUST MATCH reloc_record_t FOR A SYMBOL BASED RELO */ struct c6000_relo_record { s32 vaddr; s32 symndx; #ifndef _BIG_ENDIAN u16 disp; u16 type; #else u16 type; u16 disp; #endif }; struct c6000_gen_code { struct tramp_gen_code_hdr hdr; u32 tramp_instrs[C6X_TRAMP_WORD_COUNT]; struct c6000_relo_record relos[C6X_TRAMP_MAX_RELOS]; }; /* Hash mapping for relos that can cause trampolines. */ static const u16 tramp_map[] = { 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 0, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535 }; static const struct c6000_gen_code tramp_gen_info[] = { /* Tramp caused by R_C60PCR21 */ { /* Header - 8 instructions, 2 relos */ { sizeof(u32) * C6X_TRAMP_WORD_COUNT, 2, FIELD_OFFSET(struct c6000_gen_code, relos) }, /* Trampoline instructions */ { 0x053C54F7, /* STW.D2T2 B10, *sp--[2] */ 0x0500002A, /* || MVK.S2 , B10 */ 0x0500006A, /* MVKH.S2 , B10 */ 0x00280362, /* B.S2 B10 */ 0x053C52E6, /* LDW.D2T2 *++sp[2], B10 */ 0x00006000, /* NOP 4 */ 0x00000000, /* NOP */ 0x00000000 /* NOP */ }, /* Relocations */ { {4, 0, 0, R_C60LO16}, {8, 0, 0, R_C60HI16}, {0, 0, 0, 0x0000}, {0, 0, 0, 0x0000}, {0, 0, 0, 0x0000}, {0, 0, 0, 0x0000}, {0, 0, 0, 0x0000}, {0, 0, 0, 0x0000} } } }; /* TARGET SPECIFIC FUNCTIONS THAT MUST BE DEFINED */ static u32 tramp_size_get(void) { return sizeof(u32) * C6X_TRAMP_WORD_COUNT; } static u32 tramp_img_pkt_size_get(void) { return sizeof(struct c6000_gen_code); }