1*f5c631daSSadaf EbrahimiVIXL: ARMv8 Runtime Code Generation Library 2*f5c631daSSadaf Ebrahimi=========================================== 3*f5c631daSSadaf Ebrahimi 4*f5c631daSSadaf EbrahimiContents: 5*f5c631daSSadaf Ebrahimi 6*f5c631daSSadaf Ebrahimi * Overview 7*f5c631daSSadaf Ebrahimi * Licence 8*f5c631daSSadaf Ebrahimi * Requirements 9*f5c631daSSadaf Ebrahimi * Known limitations 10*f5c631daSSadaf Ebrahimi * Bug reports 11*f5c631daSSadaf Ebrahimi * Usage 12*f5c631daSSadaf Ebrahimi 13*f5c631daSSadaf Ebrahimi 14*f5c631daSSadaf EbrahimiOverview 15*f5c631daSSadaf Ebrahimi======== 16*f5c631daSSadaf Ebrahimi 17*f5c631daSSadaf EbrahimiVIXL contains three components. 18*f5c631daSSadaf Ebrahimi 19*f5c631daSSadaf Ebrahimi 1. Programmatic **assemblers** to generate A64, A32 or T32 code at runtime. The 20*f5c631daSSadaf Ebrahimi assemblers abstract some of the constraints of each ISA; for example, most 21*f5c631daSSadaf Ebrahimi instructions support any immediate. 22*f5c631daSSadaf Ebrahimi 2. **Disassemblers** that can print any instruction emitted by the assemblers. 23*f5c631daSSadaf Ebrahimi 3. A **simulator** that can simulate any instruction emitted by the A64 24*f5c631daSSadaf Ebrahimi assembler. The simulator allows generated code to be run on another 25*f5c631daSSadaf Ebrahimi architecture without the need for a full ISA model. 26*f5c631daSSadaf Ebrahimi 27*f5c631daSSadaf EbrahimiThe VIXL git repository can be found [on GitHub][vixl]. 28*f5c631daSSadaf Ebrahimi 29*f5c631daSSadaf EbrahimiBuild and Test Status 30*f5c631daSSadaf Ebrahimi--------------------- 31*f5c631daSSadaf Ebrahimi 32*f5c631daSSadaf Ebrahimi * [](https://ci.linaro.org/job/linaro-art-vixlpresubmit/) Simulator 33*f5c631daSSadaf Ebrahimi * [](https://ci.linaro.org/job/linaro-art-vixlpresubmit-native-armv8/) Native 34*f5c631daSSadaf Ebrahimi * [](https://ci.linaro.org/job/linaro-art-vixlpresubmit-macos/) MacOS 35*f5c631daSSadaf Ebrahimi 36*f5c631daSSadaf Ebrahimi 37*f5c631daSSadaf EbrahimiLicence 38*f5c631daSSadaf Ebrahimi======= 39*f5c631daSSadaf Ebrahimi 40*f5c631daSSadaf EbrahimiThis software is covered by the licence described in the [LICENCE](LICENCE) 41*f5c631daSSadaf Ebrahimifile. 42*f5c631daSSadaf Ebrahimi 43*f5c631daSSadaf EbrahimiContributions, as pull requests or via other means, are accepted under the terms 44*f5c631daSSadaf Ebrahimiof the same [LICENCE](LICENCE). 45*f5c631daSSadaf Ebrahimi 46*f5c631daSSadaf EbrahimiRequirements 47*f5c631daSSadaf Ebrahimi============ 48*f5c631daSSadaf Ebrahimi 49*f5c631daSSadaf EbrahimiTo build VIXL the following software is required: 50*f5c631daSSadaf Ebrahimi 51*f5c631daSSadaf Ebrahimi 1. Python 2.7 52*f5c631daSSadaf Ebrahimi 2. SCons 2.0 53*f5c631daSSadaf Ebrahimi 3. GCC 4.8+ or Clang 4.0+ 54*f5c631daSSadaf Ebrahimi 55*f5c631daSSadaf EbrahimiA 64-bit host machine is required, implementing an LP64 data model. VIXL has 56*f5c631daSSadaf Ebrahimibeen tested using GCC on AArch64 Debian, GCC and Clang on amd64 Ubuntu 57*f5c631daSSadaf Ebrahimisystems. 58*f5c631daSSadaf Ebrahimi 59*f5c631daSSadaf EbrahimiTo run the linter and code formatting stages of the tests, the following 60*f5c631daSSadaf Ebrahimisoftware is also required: 61*f5c631daSSadaf Ebrahimi 62*f5c631daSSadaf Ebrahimi 1. Git 63*f5c631daSSadaf Ebrahimi 2. [Google's `cpplint.py`][cpplint] 64*f5c631daSSadaf Ebrahimi 3. clang-format-4.0 65*f5c631daSSadaf Ebrahimi 4. clang-tidy-4.0 66*f5c631daSSadaf Ebrahimi 67*f5c631daSSadaf EbrahimiRefer to the 'Usage' section for details. 68*f5c631daSSadaf Ebrahimi 69*f5c631daSSadaf EbrahimiNote that in Ubuntu 18.04, clang-tidy-4.0 will only work if the clang-4.0 70*f5c631daSSadaf Ebrahimipackage is also installed. 71*f5c631daSSadaf Ebrahimi 72*f5c631daSSadaf EbrahimiSupported Arm Architecture Features 73*f5c631daSSadaf Ebrahimi=================================== 74*f5c631daSSadaf Ebrahimi 75*f5c631daSSadaf Ebrahimi| Feature | VIXL CPUFeatures Flag | Notes | 76*f5c631daSSadaf Ebrahimi|------------|-----------------------|---------------------------------| 77*f5c631daSSadaf Ebrahimi| BTI | kBTI | Per-page enabling not supported | 78*f5c631daSSadaf Ebrahimi| DotProd | kDotProduct | | 79*f5c631daSSadaf Ebrahimi| FCMA | kFcma | | 80*f5c631daSSadaf Ebrahimi| FHM | kFHM | | 81*f5c631daSSadaf Ebrahimi| FP16 | kFPHalf, kNEONHalf | | 82*f5c631daSSadaf Ebrahimi| FRINTTS | kFrintToFixedSizedInt | | 83*f5c631daSSadaf Ebrahimi| FlagM | kFlagM | | 84*f5c631daSSadaf Ebrahimi| FlagM2 | kAXFlag | | 85*f5c631daSSadaf Ebrahimi| I8MM | kI8MM | | 86*f5c631daSSadaf Ebrahimi| JSCVT | kJSCVT | | 87*f5c631daSSadaf Ebrahimi| LOR | kLORegions | | 88*f5c631daSSadaf Ebrahimi| LRCPC | kRCpc | | 89*f5c631daSSadaf Ebrahimi| LRCPC2 | kRCpcImm | | 90*f5c631daSSadaf Ebrahimi| LSE | kAtomics | | 91*f5c631daSSadaf Ebrahimi| PAuth | kPAuth, kPAuthGeneric | Not ERETAA, ERETAB | 92*f5c631daSSadaf Ebrahimi| RAS | kRAS | | 93*f5c631daSSadaf Ebrahimi| RDM | kRDM | | 94*f5c631daSSadaf Ebrahimi| SVE | kSVE | | 95*f5c631daSSadaf Ebrahimi| SVE2 | kSVE2 | | 96*f5c631daSSadaf Ebrahimi| SVEBitPerm | kSVEBitPerm | | 97*f5c631daSSadaf Ebrahimi| SVEF32MM | kSVEF32MM | | 98*f5c631daSSadaf Ebrahimi| SVEF64MM | kSVEF64MM | | 99*f5c631daSSadaf Ebrahimi| SVEI8MM | kSVEI8MM | | 100*f5c631daSSadaf Ebrahimi 101*f5c631daSSadaf EbrahimiEnable generating code for an architecture feature by combining a flag with 102*f5c631daSSadaf Ebrahimithe MacroAssembler's defaults. For example, to generate code for SVE, use 103*f5c631daSSadaf Ebrahimi`masm.GetCPUFeatures()->Combine(CPUFeatures::kSVE);`. 104*f5c631daSSadaf Ebrahimi 105*f5c631daSSadaf EbrahimiSee [the cpu features header file](src/cpu-features.h) for more information. 106*f5c631daSSadaf Ebrahimi 107*f5c631daSSadaf Ebrahimi 108*f5c631daSSadaf EbrahimiKnown Limitations 109*f5c631daSSadaf Ebrahimi================= 110*f5c631daSSadaf Ebrahimi 111*f5c631daSSadaf EbrahimiVIXL was developed for JavaScript engines so a number of features from A64 were 112*f5c631daSSadaf Ebrahimideemed unnecessary: 113*f5c631daSSadaf Ebrahimi 114*f5c631daSSadaf Ebrahimi * Limited rounding mode support for floating point. 115*f5c631daSSadaf Ebrahimi * Limited support for synchronisation instructions. 116*f5c631daSSadaf Ebrahimi * Limited support for system instructions. 117*f5c631daSSadaf Ebrahimi * A few miscellaneous integer and floating point instructions are missing. 118*f5c631daSSadaf Ebrahimi 119*f5c631daSSadaf EbrahimiThe VIXL simulator supports only those instructions that the VIXL assembler can 120*f5c631daSSadaf Ebrahimigenerate. The `doc` directory contains a 121*f5c631daSSadaf Ebrahimi[list of supported A64 instructions](doc/aarch64/supported-instructions-aarch64.md). 122*f5c631daSSadaf Ebrahimi 123*f5c631daSSadaf EbrahimiThe VIXL simulator was developed to run on 64-bit amd64 platforms. Whilst it 124*f5c631daSSadaf Ebrahimibuilds and mostly works for 32-bit x86 platforms, there are a number of 125*f5c631daSSadaf Ebrahimifloating-point operations which do not work correctly, and a number of tests 126*f5c631daSSadaf Ebrahimifail as a result. 127*f5c631daSSadaf Ebrahimi 128*f5c631daSSadaf EbrahimiDebug Builds 129*f5c631daSSadaf Ebrahimi------------ 130*f5c631daSSadaf Ebrahimi 131*f5c631daSSadaf EbrahimiYour project's build system must define `VIXL_DEBUG` (eg. `-DVIXL_DEBUG`) 132*f5c631daSSadaf Ebrahimiwhen using a VIXL library that has been built with debug enabled. 133*f5c631daSSadaf Ebrahimi 134*f5c631daSSadaf EbrahimiSome classes defined in VIXL header files contain fields that are only present 135*f5c631daSSadaf Ebrahimiin debug builds, so if `VIXL_DEBUG` is defined when the library is built, but 136*f5c631daSSadaf Ebrahiminot defined for the header files included in your project, you will see runtime 137*f5c631daSSadaf Ebrahimifailures. 138*f5c631daSSadaf Ebrahimi 139*f5c631daSSadaf EbrahimiExclusive-Access Instructions 140*f5c631daSSadaf Ebrahimi----------------------------- 141*f5c631daSSadaf Ebrahimi 142*f5c631daSSadaf EbrahimiAll exclusive-access instructions are supported, but the simulator cannot 143*f5c631daSSadaf Ebrahimiaccurately simulate their behaviour as described in the ARMv8 Architecture 144*f5c631daSSadaf EbrahimiReference Manual. 145*f5c631daSSadaf Ebrahimi 146*f5c631daSSadaf Ebrahimi * A local monitor is simulated, so simulated exclusive loads and stores execute 147*f5c631daSSadaf Ebrahimi as expected in a single-threaded environment. 148*f5c631daSSadaf Ebrahimi * The global monitor is simulated by occasionally causing exclusive-access 149*f5c631daSSadaf Ebrahimi instructions to fail regardless of the local monitor state. 150*f5c631daSSadaf Ebrahimi * Load-acquire, store-release semantics are approximated by issuing a host 151*f5c631daSSadaf Ebrahimi memory barrier after loads or before stores. The built-in 152*f5c631daSSadaf Ebrahimi `__sync_synchronize()` is used for this purpose. 153*f5c631daSSadaf Ebrahimi 154*f5c631daSSadaf EbrahimiThe simulator tries to be strict, and implements the following restrictions that 155*f5c631daSSadaf Ebrahimithe ARMv8 ARM allows: 156*f5c631daSSadaf Ebrahimi 157*f5c631daSSadaf Ebrahimi * A pair of load-/store-exclusive instructions will only succeed if they have 158*f5c631daSSadaf Ebrahimi the same address and access size. 159*f5c631daSSadaf Ebrahimi * Most of the time, cache-maintenance operations or explicit memory accesses 160*f5c631daSSadaf Ebrahimi will clear the exclusive monitor. 161*f5c631daSSadaf Ebrahimi * To ensure that simulated code does not depend on this behaviour, the 162*f5c631daSSadaf Ebrahimi exclusive monitor will sometimes be left intact after these instructions. 163*f5c631daSSadaf Ebrahimi 164*f5c631daSSadaf EbrahimiInstructions affected by these limitations: 165*f5c631daSSadaf Ebrahimi `stxrb`, `stxrh`, `stxr`, `ldxrb`, `ldxrh`, `ldxr`, `stxp`, `ldxp`, `stlxrb`, 166*f5c631daSSadaf Ebrahimi `stlxrh`, `stlxr`, `ldaxrb`, `ldaxrh`, `ldaxr`, `stlxp`, `ldaxp`, `stlrb`, 167*f5c631daSSadaf Ebrahimi `stlrh`, `stlr`, `ldarb`, `ldarh`, `ldar`, `clrex`. 168*f5c631daSSadaf Ebrahimi 169*f5c631daSSadaf EbrahimiSecurity Considerations 170*f5c631daSSadaf Ebrahimi----------------------- 171*f5c631daSSadaf Ebrahimi 172*f5c631daSSadaf EbrahimiVIXL allows callers to generate any code they want. The generated code is 173*f5c631daSSadaf Ebrahimiarbitrary, and can therefore call back into any other component in the process. 174*f5c631daSSadaf EbrahimiAs with any self-modifying code, vulnerabilities in the client or in VIXL itself 175*f5c631daSSadaf Ebrahimicould lead to arbitrary code generation. 176*f5c631daSSadaf Ebrahimi 177*f5c631daSSadaf EbrahimiFor performance reasons, VIXL's Assembler only performs debug-mode checking of 178*f5c631daSSadaf Ebrahimiinstruction operands (such as immediate field encodability). This can minimise 179*f5c631daSSadaf Ebrahimicode-generation overheads for advanced compilers that already model instructions 180*f5c631daSSadaf Ebrahimiaccurately, and might consider the Assembler's checks to be redundant. The 181*f5c631daSSadaf EbrahimiAssembler should only be used directly where encodability is independently 182*f5c631daSSadaf Ebrahimichecked, and where fine control over all generated code is required. 183*f5c631daSSadaf Ebrahimi 184*f5c631daSSadaf EbrahimiThe MacroAssembler synthesises multiple-instruction sequences to support _some_ 185*f5c631daSSadaf Ebrahimiunencodable operand combinations. The MacroAssembler can provide a useful safety 186*f5c631daSSadaf Ebrahimicheck in cases where the Assembler's precision is not required; an unexpected 187*f5c631daSSadaf Ebrahimiunencodable operand should result in a macro with the correct behaviour, rather 188*f5c631daSSadaf Ebrahimithan an invalid instruction. 189*f5c631daSSadaf Ebrahimi 190*f5c631daSSadaf EbrahimiIn general, the MacroAssembler handles operands which are likely to vary with 191*f5c631daSSadaf Ebrahimiuser-supplied data, but does not usually handle inputs which are likely to be 192*f5c631daSSadaf Ebrahimieasily covered by tests. For example, move-immediate arguments are likely to be 193*f5c631daSSadaf Ebrahimidata-dependent, but register types (e.g. `x` vs `w`) are not. 194*f5c631daSSadaf Ebrahimi 195*f5c631daSSadaf EbrahimiWe recommend that _all_ users use the MacroAssembler, using `ExactAssemblyScope` 196*f5c631daSSadaf Ebrahimito invoke the Assembler when specific instruction sequences are required. This 197*f5c631daSSadaf Ebrahimiapproach is recommended even in cases where a compiler can model the 198*f5c631daSSadaf Ebrahimiinstructions precisely, because, subject to the limitations described above, it 199*f5c631daSSadaf Ebrahimioffers an additional layer of protection against logic bugs in instruction 200*f5c631daSSadaf Ebrahimiselection. 201*f5c631daSSadaf Ebrahimi 202*f5c631daSSadaf EbrahimiBug reports 203*f5c631daSSadaf Ebrahimi=========== 204*f5c631daSSadaf Ebrahimi 205*f5c631daSSadaf EbrahimiBug reports may be made in the Issues section of GitHub, or sent to 206*f5c631daSSadaf Ebrahimi[email protected]. Please provide any steps required to recreate a bug, along with 207*f5c631daSSadaf Ebrahimibuild environment and host system information. 208*f5c631daSSadaf Ebrahimi 209*f5c631daSSadaf EbrahimiUsage 210*f5c631daSSadaf Ebrahimi===== 211*f5c631daSSadaf Ebrahimi 212*f5c631daSSadaf EbrahimiRunning all Tests 213*f5c631daSSadaf Ebrahimi----------------- 214*f5c631daSSadaf Ebrahimi 215*f5c631daSSadaf EbrahimiThe helper script `tools/test.py` will build and run every test that is provided 216*f5c631daSSadaf Ebrahimiwith VIXL, in both release and debug mode. It is a useful script for verifying 217*f5c631daSSadaf Ebrahimithat all of VIXL's dependencies are in place and that VIXL is working as it 218*f5c631daSSadaf Ebrahimishould. 219*f5c631daSSadaf Ebrahimi 220*f5c631daSSadaf EbrahimiBy default, the `tools/test.py` script runs a linter to check that the source 221*f5c631daSSadaf Ebrahimicode conforms with the code style guide, and to detect several common errors 222*f5c631daSSadaf Ebrahimithat the compiler may not warn about. This is most useful for VIXL developers. 223*f5c631daSSadaf EbrahimiThe linter has the following dependencies: 224*f5c631daSSadaf Ebrahimi 225*f5c631daSSadaf Ebrahimi 1. Git must be installed, and the VIXL project must be in a valid Git 226*f5c631daSSadaf Ebrahimi repository, such as one produced using `git clone`. 227*f5c631daSSadaf Ebrahimi 2. `cpplint.py`, [as provided by Google][cpplint], must be available (and 228*f5c631daSSadaf Ebrahimi executable) on the `PATH`. 229*f5c631daSSadaf Ebrahimi 230*f5c631daSSadaf EbrahimiIt is possible to tell `tools/test.py` to skip the linter stage by passing 231*f5c631daSSadaf Ebrahimi`--nolint`. This removes the dependency on `cpplint.py` and Git. The `--nolint` 232*f5c631daSSadaf Ebrahimioption is implied if the VIXL project is a snapshot (with no `.git` directory). 233*f5c631daSSadaf Ebrahimi 234*f5c631daSSadaf EbrahimiAdditionally, `tools/test.py` tests code formatting using `clang-format-4.0`, 235*f5c631daSSadaf Ebrahimiand performs static analysis using `clang-tidy-4.0`. If you don't have these 236*f5c631daSSadaf Ebrahimitools, disable the test using `--noclang-format` or `--noclang-tidy`, 237*f5c631daSSadaf Ebrahimirespectively. 238*f5c631daSSadaf Ebrahimi 239*f5c631daSSadaf EbrahimiAlso note that the tests for the tracing features depend upon external `diff` 240*f5c631daSSadaf Ebrahimiand `sed` tools. If these tools are not available in `PATH`, these tests will 241*f5c631daSSadaf Ebrahimifail. 242*f5c631daSSadaf Ebrahimi 243*f5c631daSSadaf EbrahimiGetting Started 244*f5c631daSSadaf Ebrahimi--------------- 245*f5c631daSSadaf Ebrahimi 246*f5c631daSSadaf EbrahimiWe have separate guides for introducing VIXL, depending on what architecture you 247*f5c631daSSadaf Ebrahimiare targeting. A guide for working with AArch32 can be found 248*f5c631daSSadaf Ebrahimi[here][getting-started-aarch32], while the AArch64 guide is 249*f5c631daSSadaf Ebrahimi[here][getting-started-aarch64]. Example source code is provided in the 250*f5c631daSSadaf Ebrahimi[examples](examples) directory. You can build examples with either `scons 251*f5c631daSSadaf Ebrahimiaarch32_examples` or `scons aarch64_examples` from the root directory, or use 252*f5c631daSSadaf Ebrahimi`scons --help` to get a detailed list of available build targets. 253*f5c631daSSadaf Ebrahimi 254*f5c631daSSadaf Ebrahimi 255*f5c631daSSadaf Ebrahimi 256*f5c631daSSadaf Ebrahimi 257*f5c631daSSadaf Ebrahimi[cpplint]: https://github.com/google/styleguide/tree/gh-pages/cpplint 258*f5c631daSSadaf Ebrahimi "Google's cpplint.py script." 259*f5c631daSSadaf Ebrahimi 260*f5c631daSSadaf Ebrahimi[vixl]: https://github.com/Linaro/vixl 261*f5c631daSSadaf Ebrahimi "The VIXL repository on GitHub." 262*f5c631daSSadaf Ebrahimi 263*f5c631daSSadaf Ebrahimi[getting-started-aarch32]: doc/aarch32/getting-started-aarch32.md 264*f5c631daSSadaf Ebrahimi "Introduction to VIXL for AArch32." 265*f5c631daSSadaf Ebrahimi 266*f5c631daSSadaf Ebrahimi[getting-started-aarch64]: doc/aarch64/getting-started-aarch64.md 267*f5c631daSSadaf Ebrahimi "Introduction to VIXL for AArch64." 268