xref: /aosp_15_r20/external/libffi/src/arm/gentramp.sh (revision 1fd5a2e1d639cd1ddf29dd0c484c123bbd850c21)
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