1// Copyright 2014, VIXL authors 2// 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 <cstdlib> 28#include <string> 29 30#include "test-runner.h" 31 32#include "aarch64/decoder-aarch64.h" 33#include "aarch64/disasm-aarch64.h" 34 35#define TEST(name) TEST_(AARCH64_FUZZ_##name) 36 37 38namespace vixl { 39namespace aarch64 { 40 41static void FuzzHelper(std::string mode, int step_size, int offset, int shift) { 42 Decoder decoder; 43 PrintDisassembler disasm(stdout); 44 Instruction buffer[kInstructionSize]; 45 46 if (mode == "disasm") { 47 decoder.AppendVisitor(&disasm); 48 } else { 49 VIXL_CHECK(mode == "decoder"); 50 } 51 52 for (uint64_t i = offset << shift; i < (UINT64_C(1) << 32); i += step_size) { 53 buffer->SetInstructionBits(static_cast<uint32_t>(i)); 54 decoder.Decode(buffer); 55 } 56} 57 58// Number of shards used to split fuzz tests. This value isn't used in the macro 59// below, so if you change this, ensure more FUZZ_SHARD instances are 60// instantiated. 61static const int kShardCount = 16; 62 63// Test approximately 1% of the instruction space for the decoder, and 0.2% for 64// the disassembler. Multiply the step size by the number of shards issued. 65static const int kDecoderStep = 100 * kShardCount + 1; 66static const int kDisasmStep = 500 * kShardCount + 1; 67 68// Shift the offset argument into the top-level opcode bits, which helps to 69// spread the fuzz coverage across instruction classes. 70static const int kOpFieldShift = 25; 71 72#define FUZZ_SHARD(mode, step, i, shift) \ 73 TEST(mode##_##i) { FuzzHelper(#mode, step, i, shift); } 74 75FUZZ_SHARD(decoder, kDecoderStep, 0, kOpFieldShift) 76FUZZ_SHARD(decoder, kDecoderStep, 1, kOpFieldShift) 77FUZZ_SHARD(decoder, kDecoderStep, 2, kOpFieldShift) 78FUZZ_SHARD(decoder, kDecoderStep, 3, kOpFieldShift) 79FUZZ_SHARD(decoder, kDecoderStep, 4, kOpFieldShift) 80FUZZ_SHARD(decoder, kDecoderStep, 5, kOpFieldShift) 81FUZZ_SHARD(decoder, kDecoderStep, 6, kOpFieldShift) 82FUZZ_SHARD(decoder, kDecoderStep, 7, kOpFieldShift) 83FUZZ_SHARD(decoder, kDecoderStep, 8, kOpFieldShift) 84FUZZ_SHARD(decoder, kDecoderStep, 9, kOpFieldShift) 85FUZZ_SHARD(decoder, kDecoderStep, 10, kOpFieldShift) 86FUZZ_SHARD(decoder, kDecoderStep, 11, kOpFieldShift) 87FUZZ_SHARD(decoder, kDecoderStep, 12, kOpFieldShift) 88FUZZ_SHARD(decoder, kDecoderStep, 13, kOpFieldShift) 89FUZZ_SHARD(decoder, kDecoderStep, 14, kOpFieldShift) 90FUZZ_SHARD(decoder, kDecoderStep, 15, kOpFieldShift) 91 92FUZZ_SHARD(disasm, kDisasmStep, 0, kOpFieldShift) 93FUZZ_SHARD(disasm, kDisasmStep, 1, kOpFieldShift) 94FUZZ_SHARD(disasm, kDisasmStep, 2, kOpFieldShift) 95FUZZ_SHARD(disasm, kDisasmStep, 3, kOpFieldShift) 96FUZZ_SHARD(disasm, kDisasmStep, 4, kOpFieldShift) 97FUZZ_SHARD(disasm, kDisasmStep, 5, kOpFieldShift) 98FUZZ_SHARD(disasm, kDisasmStep, 6, kOpFieldShift) 99FUZZ_SHARD(disasm, kDisasmStep, 7, kOpFieldShift) 100FUZZ_SHARD(disasm, kDisasmStep, 8, kOpFieldShift) 101FUZZ_SHARD(disasm, kDisasmStep, 9, kOpFieldShift) 102FUZZ_SHARD(disasm, kDisasmStep, 10, kOpFieldShift) 103FUZZ_SHARD(disasm, kDisasmStep, 11, kOpFieldShift) 104FUZZ_SHARD(disasm, kDisasmStep, 12, kOpFieldShift) 105FUZZ_SHARD(disasm, kDisasmStep, 13, kOpFieldShift) 106FUZZ_SHARD(disasm, kDisasmStep, 14, kOpFieldShift) 107FUZZ_SHARD(disasm, kDisasmStep, 15, kOpFieldShift) 108 109} // namespace aarch64 110} // namespace vixl 111