1b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines/* 2b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines * Copyright 2011, The Android Open Source Project 3b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines * 4b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines * Licensed under the Apache License, Version 2.0 (the "License"); 5b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines * you may not use this file except in compliance with the License. 6b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines * You may obtain a copy of the License at 7b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines * 8b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines * http://www.apache.org/licenses/LICENSE-2.0 9b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines * 10b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines * Unless required by applicable law or agreed to in writing, software 11b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines * distributed under the License is distributed on an "AS IS" BASIS, 12b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines * See the License for the specific language governing permissions and 14b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines * limitations under the License. 15b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines */ 16b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 17b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines#ifndef STUB_LAYOUT_H 18b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines#define STUB_LAYOUT_H 19b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 20b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines#include <map> 21b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines#include <stdlib.h> 22b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 23b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hinesclass StubLayout { 24b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hinesprivate: 25b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines unsigned char *table; 26b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines size_t count; 27b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 28b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines std::map<void *, void *> stub_index; 29b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 30b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hinespublic: 31b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines StubLayout(); 32b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines virtual ~StubLayout() { } 33b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 34b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines void initStubTable(unsigned char *table, size_t count); 35b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines void *allocateStub(void *addr = 0); 36b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 37b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines size_t calcStubTableSize(size_t count) const; 38b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines virtual size_t getUnitStubSize() const = 0; 39b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 40b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hinesprivate: 41b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines virtual void setStubAddress(void *stub, void *addr) = 0; 42b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 43b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines}; 44b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 45b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hinesclass StubLayoutARM : public StubLayout { 46b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hinespublic: 47b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines StubLayoutARM() { } 48b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines size_t getUnitStubSize() const; 49b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 50b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hinesprivate: 51b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines virtual void setStubAddress(void *stub, void *addr); 52b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines}; 53b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 5430e2a4c8d848bc788cc5600e6b929b4f761f3f03Dave Allisonclass StubLayoutAARCH64 : public StubLayout { 5530e2a4c8d848bc788cc5600e6b929b4f761f3f03Dave Allisonpublic: 5630e2a4c8d848bc788cc5600e6b929b4f761f3f03Dave Allison StubLayoutAARCH64() { } 5730e2a4c8d848bc788cc5600e6b929b4f761f3f03Dave Allison size_t getUnitStubSize() const; 5830e2a4c8d848bc788cc5600e6b929b4f761f3f03Dave Allison 5930e2a4c8d848bc788cc5600e6b929b4f761f3f03Dave Allisonprivate: 6030e2a4c8d848bc788cc5600e6b929b4f761f3f03Dave Allison virtual void setStubAddress(void *stub, void *addr); 6130e2a4c8d848bc788cc5600e6b929b4f761f3f03Dave Allison}; 6230e2a4c8d848bc788cc5600e6b929b4f761f3f03Dave Allison 63b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hinesclass StubLayoutMIPS : public StubLayout { 64b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hinespublic: 65b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines StubLayoutMIPS() { } 66b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines size_t getUnitStubSize() const; 67b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 68b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hinesprivate: 69b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines virtual void setStubAddress(void *stub, void *addr); 70b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines}; 71b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 7272151aac81a3cc92b9777aaa9b80f31a4ce9fcf7Xiaofei Wanclass StubLayoutX86 : public StubLayout { 7372151aac81a3cc92b9777aaa9b80f31a4ce9fcf7Xiaofei Wanpublic: 7472151aac81a3cc92b9777aaa9b80f31a4ce9fcf7Xiaofei Wan StubLayoutX86() { } 7572151aac81a3cc92b9777aaa9b80f31a4ce9fcf7Xiaofei Wan size_t getUnitStubSize() const; 7672151aac81a3cc92b9777aaa9b80f31a4ce9fcf7Xiaofei Wan 7772151aac81a3cc92b9777aaa9b80f31a4ce9fcf7Xiaofei Wanprivate: 7872151aac81a3cc92b9777aaa9b80f31a4ce9fcf7Xiaofei Wan virtual void setStubAddress(void *stub, void *addr); 7972151aac81a3cc92b9777aaa9b80f31a4ce9fcf7Xiaofei Wan}; 8072151aac81a3cc92b9777aaa9b80f31a4ce9fcf7Xiaofei Wan 8172151aac81a3cc92b9777aaa9b80f31a4ce9fcf7Xiaofei Wanclass StubLayoutX86_64 : public StubLayout { 8272151aac81a3cc92b9777aaa9b80f31a4ce9fcf7Xiaofei Wanpublic: 8372151aac81a3cc92b9777aaa9b80f31a4ce9fcf7Xiaofei Wan StubLayoutX86_64() { } 8472151aac81a3cc92b9777aaa9b80f31a4ce9fcf7Xiaofei Wan size_t getUnitStubSize() const; 8572151aac81a3cc92b9777aaa9b80f31a4ce9fcf7Xiaofei Wan 8672151aac81a3cc92b9777aaa9b80f31a4ce9fcf7Xiaofei Wanprivate: 8772151aac81a3cc92b9777aaa9b80f31a4ce9fcf7Xiaofei Wan virtual void setStubAddress(void *stub, void *addr); 8872151aac81a3cc92b9777aaa9b80f31a4ce9fcf7Xiaofei Wan}; 89b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 90b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines#endif // STUB_LAYOUT_H 91