1f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org// Copyright 2013 the V8 project authors. All rights reserved. 2f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org// Redistribution and use in source and binary forms, with or without 3f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org// modification, are permitted provided that the following conditions are met: 4f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org// 5f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org// * Redistributions of source code must retain the above copyright notice, 6f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org// this list of conditions and the following disclaimer. 7f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org// * Redistributions in binary form must reproduce the above copyright notice, 8f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org// this list of conditions and the following disclaimer in the documentation 9f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org// and/or other materials provided with the distribution. 10f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org// * Neither the name of ARM Limited nor the names of its contributors may be 11f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org// used to endorse or promote products derived from this software without 12f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org// specific prior written permission. 13f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org// 14f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS CONTRIBUTORS "AS IS" AND 15f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 16f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 17f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE 18f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 20f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 21f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 22f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 23f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 25f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org#include <stdlib.h> 26196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "test/cctest/cctest.h" 27f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 28196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/arm64/decoder-arm64.h" 29196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/arm64/decoder-arm64-inl.h" 30196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/arm64/disasm-arm64.h" 31f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 32f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgusing namespace v8::internal; 33f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 34f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgTEST(FUZZ_decoder) { 35f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org // Feed noise into the decoder to check that it doesn't crash. 36f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org // 43 million = ~1% of the instruction space. 37f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org static const int instruction_count = 43 * 1024 * 1024; 38f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 39f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org uint16_t seed[3] = {1, 2, 3}; 40f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org seed48(seed); 41f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 42f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org Decoder<DispatchingDecoderVisitor> decoder; 43f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org Instruction buffer[kInstructionSize]; 44f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 45f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org for (int i = 0; i < instruction_count; i++) { 46f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org uint32_t instr = mrand48(); 47f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org buffer->SetInstructionBits(instr); 48f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org decoder.Decode(buffer); 49f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 50f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 51f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 52f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 53f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgTEST(FUZZ_disasm) { 54f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org // Feed noise into the disassembler to check that it doesn't crash. 55f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org // 9 million = ~0.2% of the instruction space. 56f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org static const int instruction_count = 9 * 1024 * 1024; 57f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 58f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org uint16_t seed[3] = {42, 43, 44}; 59f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org seed48(seed); 60f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 61f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org Decoder<DispatchingDecoderVisitor> decoder; 62f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org Disassembler disasm; 63f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org Instruction buffer[kInstructionSize]; 64f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 65f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org decoder.AppendVisitor(&disasm); 66f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org for (int i = 0; i < instruction_count; i++) { 67f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org uint32_t instr = mrand48(); 68f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org buffer->SetInstructionBits(instr); 69f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org decoder.Decode(buffer); 70f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 71f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 72