1e6622be6c353c7178f34adf814c58370a51c5ed7Serban Constantinescu/* 2e6622be6c353c7178f34adf814c58370a51c5ed7Serban Constantinescu * Copyright (C) 2014 The Android Open Source Project 3e6622be6c353c7178f34adf814c58370a51c5ed7Serban Constantinescu * 4e6622be6c353c7178f34adf814c58370a51c5ed7Serban Constantinescu * Licensed under the Apache License, Version 2.0 (the "License"); 5e6622be6c353c7178f34adf814c58370a51c5ed7Serban Constantinescu * you may not use this file except in compliance with the License. 6e6622be6c353c7178f34adf814c58370a51c5ed7Serban Constantinescu * You may obtain a copy of the License at 7e6622be6c353c7178f34adf814c58370a51c5ed7Serban Constantinescu * 8e6622be6c353c7178f34adf814c58370a51c5ed7Serban Constantinescu * http://www.apache.org/licenses/LICENSE-2.0 9e6622be6c353c7178f34adf814c58370a51c5ed7Serban Constantinescu * 10e6622be6c353c7178f34adf814c58370a51c5ed7Serban Constantinescu * Unless required by applicable law or agreed to in writing, software 11e6622be6c353c7178f34adf814c58370a51c5ed7Serban Constantinescu * distributed under the License is distributed on an "AS IS" BASIS, 12e6622be6c353c7178f34adf814c58370a51c5ed7Serban Constantinescu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e6622be6c353c7178f34adf814c58370a51c5ed7Serban Constantinescu * See the License for the specific language governing permissions and 14e6622be6c353c7178f34adf814c58370a51c5ed7Serban Constantinescu * limitations under the License. 15e6622be6c353c7178f34adf814c58370a51c5ed7Serban Constantinescu */ 16e6622be6c353c7178f34adf814c58370a51c5ed7Serban Constantinescu 17e6622be6c353c7178f34adf814c58370a51c5ed7Serban Constantinescu#include "disassembler_arm64.h" 18e6622be6c353c7178f34adf814c58370a51c5ed7Serban Constantinescu 19e6622be6c353c7178f34adf814c58370a51c5ed7Serban Constantinescu#include <inttypes.h> 20e6622be6c353c7178f34adf814c58370a51c5ed7Serban Constantinescu 21e6622be6c353c7178f34adf814c58370a51c5ed7Serban Constantinescu#include <iostream> 22e6622be6c353c7178f34adf814c58370a51c5ed7Serban Constantinescu 23e6622be6c353c7178f34adf814c58370a51c5ed7Serban Constantinescu#include "base/logging.h" 24e6622be6c353c7178f34adf814c58370a51c5ed7Serban Constantinescu#include "base/stringprintf.h" 25e6622be6c353c7178f34adf814c58370a51c5ed7Serban Constantinescu#include "thread.h" 26e6622be6c353c7178f34adf814c58370a51c5ed7Serban Constantinescu 27e6622be6c353c7178f34adf814c58370a51c5ed7Serban Constantinescunamespace art { 28e6622be6c353c7178f34adf814c58370a51c5ed7Serban Constantinescunamespace arm64 { 29e6622be6c353c7178f34adf814c58370a51c5ed7Serban Constantinescu 30e6622be6c353c7178f34adf814c58370a51c5ed7Serban Constantinescustatic uint32_t ReadU32(const uint8_t* ptr) { 31e6622be6c353c7178f34adf814c58370a51c5ed7Serban Constantinescu return *((const uint32_t*)ptr); 32e6622be6c353c7178f34adf814c58370a51c5ed7Serban Constantinescu} 33e6622be6c353c7178f34adf814c58370a51c5ed7Serban Constantinescu 34e6622be6c353c7178f34adf814c58370a51c5ed7Serban Constantinescusize_t DisassemblerArm64::Dump(std::ostream& os, const uint8_t* begin) { 35e6622be6c353c7178f34adf814c58370a51c5ed7Serban Constantinescu uint32_t instruction = ReadU32(begin); 36e6622be6c353c7178f34adf814c58370a51c5ed7Serban Constantinescu decoder.Decode(reinterpret_cast<vixl::Instruction*>(&instruction)); 3734fa79ece5b3a1940d412cd94dbdcc4225aae72fBrian Carlstrom os << FormatInstructionPointer(begin) 3834fa79ece5b3a1940d412cd94dbdcc4225aae72fBrian Carlstrom << StringPrintf(": %08x\t%s\n", instruction, disasm.GetOutput()); 39e6622be6c353c7178f34adf814c58370a51c5ed7Serban Constantinescu return vixl::kInstructionSize; 40e6622be6c353c7178f34adf814c58370a51c5ed7Serban Constantinescu} 41e6622be6c353c7178f34adf814c58370a51c5ed7Serban Constantinescu 42e6622be6c353c7178f34adf814c58370a51c5ed7Serban Constantinescuvoid DisassemblerArm64::Dump(std::ostream& os, const uint8_t* begin, const uint8_t* end) { 43e6622be6c353c7178f34adf814c58370a51c5ed7Serban Constantinescu for (const uint8_t* cur = begin; cur < end; cur += vixl::kInstructionSize) { 44e6622be6c353c7178f34adf814c58370a51c5ed7Serban Constantinescu Dump(os, cur); 45e6622be6c353c7178f34adf814c58370a51c5ed7Serban Constantinescu } 46e6622be6c353c7178f34adf814c58370a51c5ed7Serban Constantinescu} 47e6622be6c353c7178f34adf814c58370a51c5ed7Serban Constantinescu 48e6622be6c353c7178f34adf814c58370a51c5ed7Serban Constantinescu} // namespace arm64 49e6622be6c353c7178f34adf814c58370a51c5ed7Serban Constantinescu} // namespace art 50