blob: 395476e21741ab0aa5cd6de494539d1489484137 [file] [log] [blame]
Alexandre Ramesb78f1392016-07-01 14:22:22 +01001// Copyright 2015, VIXL authors
Pierre Langlois88c46b82016-06-02 18:15:32 +01002// All rights reserved.
3//
4// Redistribution and use in source and binary forms, with or without
5// modification, are permitted provided that the following conditions are met:
6//
7// * Redistributions of source code must retain the above copyright notice,
8// this list of conditions and the following disclaimer.
9// * Redistributions in binary form must reproduce the above copyright notice,
10// this list of conditions and the following disclaimer in the documentation
11// and/or other materials provided with the distribution.
12// * Neither the name of ARM Limited nor the names of its contributors may be
13// used to endorse or promote products derived from this software without
14// specific prior written permission.
15//
16// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS CONTRIBUTORS "AS IS" AND
17// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
20// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
22// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
23// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
25// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26
27#include "test-utils.h"
28
Jacob Bramley48934322019-02-04 18:27:53 +000029#include <string.h>
30
Pierre Langlois78973f22016-08-10 14:35:56 +010031extern "C" {
Pierre Langlois88c46b82016-06-02 18:15:32 +010032#include <sys/mman.h>
Pierre Langlois78973f22016-08-10 14:35:56 +010033}
Pierre Langlois88c46b82016-06-02 18:15:32 +010034
35#include "globals-vixl.h"
Jacob Bramley48934322019-02-04 18:27:53 +000036
37#ifdef VIXL_INCLUDE_TARGET_AARCH64
Alexandre Ramesd3832962016-07-04 15:03:43 +010038#include "aarch64/cpu-aarch64.h"
Jacob Bramley48934322019-02-04 18:27:53 +000039#endif
Pierre Langlois88c46b82016-06-02 18:15:32 +010040
41namespace vixl {
42
Alexandre Rames2b5d5612016-07-25 14:14:22 +010043// BSD uses `MAP_ANON` instead of the Linux `MAP_ANONYMOUS`. The `MAP_ANONYMOUS`
44// alias should generally be available, but is not always, so define it manually
45// if necessary.
46#if !defined(MAP_ANONYMOUS) && defined(MAP_ANON)
47#define MAP_ANONYMOUS MAP_ANON
48#endif
49
Pierre Langlois88c46b82016-06-02 18:15:32 +010050
Jacob Bramley48934322019-02-04 18:27:53 +000051void ExecuteMemory(byte* buffer, size_t size, int byte_offset) {
Pierre Langlois88c46b82016-06-02 18:15:32 +010052 void (*test_function)(void);
53
Jacob Bramley48934322019-02-04 18:27:53 +000054 VIXL_ASSERT((byte_offset >= 0) && (static_cast<size_t>(byte_offset) < size));
Alex Gilday31dd2ae2016-07-05 16:34:41 +010055 VIXL_STATIC_ASSERT(sizeof(buffer) == sizeof(test_function));
Pierre Langlois88c46b82016-06-02 18:15:32 +010056 VIXL_STATIC_ASSERT(sizeof(uintptr_t) == sizeof(test_function));
Alex Gilday31dd2ae2016-07-05 16:34:41 +010057 uintptr_t entry_point = reinterpret_cast<uintptr_t>(buffer);
Jacob Bramley48934322019-02-04 18:27:53 +000058 entry_point += byte_offset;
Pierre Langlois88c46b82016-06-02 18:15:32 +010059 memcpy(&test_function, &entry_point, sizeof(test_function));
60
Alex Gilday31dd2ae2016-07-05 16:34:41 +010061 USE(size);
62
Pierre Langloisdd63b6b2016-12-19 13:22:33 +000063#if defined(__aarch64__) && defined(VIXL_INCLUDE_TARGET_AARCH64)
Alex Gilday31dd2ae2016-07-05 16:34:41 +010064 aarch64::CPU::EnsureIAndDCacheCoherency(buffer, size);
Rodolph Perfetta9a9331f2016-12-09 22:05:48 +000065#elif defined(__arm__) && \
Pierre Langloisbde2e4b2017-01-24 17:41:26 +000066 (defined(VIXL_INCLUDE_TARGET_A32) || defined(VIXL_INCLUDE_TARGET_T32))
Pierre Langlois88c46b82016-06-02 18:15:32 +010067 // TODO: Do not use __builtin___clear_cache and instead implement
68 // `CPU::EnsureIAndDCacheCoherency` for aarch32.
Alex Gilday31dd2ae2016-07-05 16:34:41 +010069 __builtin___clear_cache(buffer, reinterpret_cast<char*>(buffer) + size);
Jacob Bramley48934322019-02-04 18:27:53 +000070#else
71 // This helper requires a native (non-Simulator) environment.
72 VIXL_ABORT_WITH_MSG("Cannot ExecuteMemory(...): unsupported platform.");
Pierre Langlois88c46b82016-06-02 18:15:32 +010073#endif
74 test_function();
75}
76
77} // namespace vixl