1*1fd5a2e1SPrashanth Swaminathan#!/bin/sh 2*1fd5a2e1SPrashanth Swaminathan 3*1fd5a2e1SPrashanth Swaminathan# ----------------------------------------------------------------------- 4*1fd5a2e1SPrashanth Swaminathan# gentramp.sh - Copyright (c) 2010, Plausible Labs Cooperative, Inc. 5*1fd5a2e1SPrashanth Swaminathan# 6*1fd5a2e1SPrashanth Swaminathan# ARM Trampoline Page Generator 7*1fd5a2e1SPrashanth Swaminathan# 8*1fd5a2e1SPrashanth Swaminathan# Permission is hereby granted, free of charge, to any person obtaining 9*1fd5a2e1SPrashanth Swaminathan# a copy of this software and associated documentation files (the 10*1fd5a2e1SPrashanth Swaminathan# ``Software''), to deal in the Software without restriction, including 11*1fd5a2e1SPrashanth Swaminathan# without limitation the rights to use, copy, modify, merge, publish, 12*1fd5a2e1SPrashanth Swaminathan# distribute, sublicense, and/or sell copies of the Software, and to 13*1fd5a2e1SPrashanth Swaminathan# permit persons to whom the Software is furnished to do so, subject to 14*1fd5a2e1SPrashanth Swaminathan# the following conditions: 15*1fd5a2e1SPrashanth Swaminathan# 16*1fd5a2e1SPrashanth Swaminathan# The above copyright notice and this permission notice shall be included 17*1fd5a2e1SPrashanth Swaminathan# in all copies or substantial portions of the Software. 18*1fd5a2e1SPrashanth Swaminathan# 19*1fd5a2e1SPrashanth Swaminathan# THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, 20*1fd5a2e1SPrashanth Swaminathan# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 21*1fd5a2e1SPrashanth Swaminathan# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 22*1fd5a2e1SPrashanth Swaminathan# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 23*1fd5a2e1SPrashanth Swaminathan# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 24*1fd5a2e1SPrashanth Swaminathan# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 25*1fd5a2e1SPrashanth Swaminathan# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 26*1fd5a2e1SPrashanth Swaminathan# DEALINGS IN THE SOFTWARE. 27*1fd5a2e1SPrashanth Swaminathan# ----------------------------------------------------------------------- 28*1fd5a2e1SPrashanth Swaminathan 29*1fd5a2e1SPrashanth SwaminathanPROGNAME=$0 30*1fd5a2e1SPrashanth Swaminathan 31*1fd5a2e1SPrashanth Swaminathan# Each trampoline is exactly 3 instructions, or 12 bytes. If any of these values change, 32*1fd5a2e1SPrashanth Swaminathan# the entire arm trampoline implementation must be updated to match, too. 33*1fd5a2e1SPrashanth Swaminathan 34*1fd5a2e1SPrashanth Swaminathan# Size of an individual trampoline, in bytes 35*1fd5a2e1SPrashanth SwaminathanTRAMPOLINE_SIZE=12 36*1fd5a2e1SPrashanth Swaminathan 37*1fd5a2e1SPrashanth Swaminathan# Page size, in bytes 38*1fd5a2e1SPrashanth SwaminathanPAGE_SIZE=4096 39*1fd5a2e1SPrashanth Swaminathan 40*1fd5a2e1SPrashanth Swaminathan# Compute the size of the reachable config page; The first 16 bytes of the config page 41*1fd5a2e1SPrashanth Swaminathan# are unreachable due to our maximum pc-relative ldr offset. 42*1fd5a2e1SPrashanth SwaminathanPAGE_AVAIL=`expr $PAGE_SIZE - 16` 43*1fd5a2e1SPrashanth Swaminathan 44*1fd5a2e1SPrashanth Swaminathan# Compute the number of of available trampolines. 45*1fd5a2e1SPrashanth SwaminathanTRAMPOLINE_COUNT=`expr $PAGE_AVAIL / $TRAMPOLINE_SIZE` 46*1fd5a2e1SPrashanth Swaminathan 47*1fd5a2e1SPrashanth Swaminathanheader () { 48*1fd5a2e1SPrashanth Swaminathan echo "# GENERATED CODE - DO NOT EDIT" 49*1fd5a2e1SPrashanth Swaminathan echo "# This file was generated by $PROGNAME" 50*1fd5a2e1SPrashanth Swaminathan echo "" 51*1fd5a2e1SPrashanth Swaminathan 52*1fd5a2e1SPrashanth Swaminathan # Write out the license header 53*1fd5a2e1SPrashanth Swaminathancat << EOF 54*1fd5a2e1SPrashanth Swaminathan# Copyright (c) 2010, Plausible Labs Cooperative, Inc. 55*1fd5a2e1SPrashanth Swaminathan# 56*1fd5a2e1SPrashanth Swaminathan# Permission is hereby granted, free of charge, to any person obtaining 57*1fd5a2e1SPrashanth Swaminathan# a copy of this software and associated documentation files (the 58*1fd5a2e1SPrashanth Swaminathan# ``Software''), to deal in the Software without restriction, including 59*1fd5a2e1SPrashanth Swaminathan# without limitation the rights to use, copy, modify, merge, publish, 60*1fd5a2e1SPrashanth Swaminathan# distribute, sublicense, and/or sell copies of the Software, and to 61*1fd5a2e1SPrashanth Swaminathan# permit persons to whom the Software is furnished to do so, subject to 62*1fd5a2e1SPrashanth Swaminathan# the following conditions: 63*1fd5a2e1SPrashanth Swaminathan# 64*1fd5a2e1SPrashanth Swaminathan# The above copyright notice and this permission notice shall be included 65*1fd5a2e1SPrashanth Swaminathan# in all copies or substantial portions of the Software. 66*1fd5a2e1SPrashanth Swaminathan# 67*1fd5a2e1SPrashanth Swaminathan# THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, 68*1fd5a2e1SPrashanth Swaminathan# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 69*1fd5a2e1SPrashanth Swaminathan# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 70*1fd5a2e1SPrashanth Swaminathan# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 71*1fd5a2e1SPrashanth Swaminathan# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 72*1fd5a2e1SPrashanth Swaminathan# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 73*1fd5a2e1SPrashanth Swaminathan# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 74*1fd5a2e1SPrashanth Swaminathan# DEALINGS IN THE SOFTWARE. 75*1fd5a2e1SPrashanth Swaminathan# ----------------------------------------------------------------------- 76*1fd5a2e1SPrashanth Swaminathan 77*1fd5a2e1SPrashanth SwaminathanEOF 78*1fd5a2e1SPrashanth Swaminathan 79*1fd5a2e1SPrashanth Swaminathan # Write out the trampoline table, aligned to the page boundary 80*1fd5a2e1SPrashanth Swaminathan echo ".text" 81*1fd5a2e1SPrashanth Swaminathan echo ".align 12" 82*1fd5a2e1SPrashanth Swaminathan echo ".globl _ffi_closure_trampoline_table_page" 83*1fd5a2e1SPrashanth Swaminathan echo "_ffi_closure_trampoline_table_page:" 84*1fd5a2e1SPrashanth Swaminathan} 85*1fd5a2e1SPrashanth Swaminathan 86*1fd5a2e1SPrashanth Swaminathan 87*1fd5a2e1SPrashanth Swaminathan# WARNING - Don't modify the trampoline code size without also updating the relevant libffi code 88*1fd5a2e1SPrashanth Swaminathantrampoline () { 89*1fd5a2e1SPrashanth Swaminathan cat << END 90*1fd5a2e1SPrashanth Swaminathan 91*1fd5a2e1SPrashanth Swaminathan // trampoline 92*1fd5a2e1SPrashanth Swaminathan // Save to stack 93*1fd5a2e1SPrashanth Swaminathan stmfd sp!, {r0-r3} 94*1fd5a2e1SPrashanth Swaminathan 95*1fd5a2e1SPrashanth Swaminathan // Load the context argument from the config page. 96*1fd5a2e1SPrashanth Swaminathan // This places the first usable config value at _ffi_closure_trampoline_table-4080 97*1fd5a2e1SPrashanth Swaminathan // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. 98*1fd5a2e1SPrashanth Swaminathan ldr r0, [pc, #-4092] 99*1fd5a2e1SPrashanth Swaminathan 100*1fd5a2e1SPrashanth Swaminathan // Load the jump address from the config page. 101*1fd5a2e1SPrashanth Swaminathan ldr pc, [pc, #-4092] 102*1fd5a2e1SPrashanth Swaminathan 103*1fd5a2e1SPrashanth SwaminathanEND 104*1fd5a2e1SPrashanth Swaminathan} 105*1fd5a2e1SPrashanth Swaminathan 106*1fd5a2e1SPrashanth Swaminathanmain () { 107*1fd5a2e1SPrashanth Swaminathan # Write out the header 108*1fd5a2e1SPrashanth Swaminathan header 109*1fd5a2e1SPrashanth Swaminathan 110*1fd5a2e1SPrashanth Swaminathan # Write out the trampolines 111*1fd5a2e1SPrashanth Swaminathan local i=0 112*1fd5a2e1SPrashanth Swaminathan while [ $i -lt ${TRAMPOLINE_COUNT} ]; do 113*1fd5a2e1SPrashanth Swaminathan trampoline 114*1fd5a2e1SPrashanth Swaminathan local i=`expr $i + 1` 115*1fd5a2e1SPrashanth Swaminathan done 116*1fd5a2e1SPrashanth Swaminathan} 117*1fd5a2e1SPrashanth Swaminathan 118*1fd5a2e1SPrashanth Swaminathanmain 119