15f757f3fSDimitry Andric //===-- AddressableBits.cpp -----------------------------------------------===// 25f757f3fSDimitry Andric // 35f757f3fSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 45f757f3fSDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 55f757f3fSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 65f757f3fSDimitry Andric // 75f757f3fSDimitry Andric //===----------------------------------------------------------------------===// 85f757f3fSDimitry Andric 95f757f3fSDimitry Andric #include "lldb/Utility/AddressableBits.h" 105f757f3fSDimitry Andric #include "lldb/lldb-types.h" 115f757f3fSDimitry Andric 12*0fca6ea1SDimitry Andric #include <cassert> 13*0fca6ea1SDimitry Andric 145f757f3fSDimitry Andric using namespace lldb; 155f757f3fSDimitry Andric using namespace lldb_private; 165f757f3fSDimitry Andric 175f757f3fSDimitry Andric void AddressableBits::SetAddressableBits(uint32_t addressing_bits) { 185f757f3fSDimitry Andric m_low_memory_addr_bits = m_high_memory_addr_bits = addressing_bits; 195f757f3fSDimitry Andric } 205f757f3fSDimitry Andric 215f757f3fSDimitry Andric void AddressableBits::SetAddressableBits(uint32_t lowmem_addressing_bits, 225f757f3fSDimitry Andric uint32_t highmem_addressing_bits) { 235f757f3fSDimitry Andric m_low_memory_addr_bits = lowmem_addressing_bits; 245f757f3fSDimitry Andric m_high_memory_addr_bits = highmem_addressing_bits; 255f757f3fSDimitry Andric } 265f757f3fSDimitry Andric 275f757f3fSDimitry Andric void AddressableBits::SetLowmemAddressableBits( 285f757f3fSDimitry Andric uint32_t lowmem_addressing_bits) { 295f757f3fSDimitry Andric m_low_memory_addr_bits = lowmem_addressing_bits; 305f757f3fSDimitry Andric } 315f757f3fSDimitry Andric 32*0fca6ea1SDimitry Andric uint32_t AddressableBits::GetLowmemAddressableBits() const { 33*0fca6ea1SDimitry Andric return m_low_memory_addr_bits; 34*0fca6ea1SDimitry Andric } 35*0fca6ea1SDimitry Andric 365f757f3fSDimitry Andric void AddressableBits::SetHighmemAddressableBits( 375f757f3fSDimitry Andric uint32_t highmem_addressing_bits) { 385f757f3fSDimitry Andric m_high_memory_addr_bits = highmem_addressing_bits; 395f757f3fSDimitry Andric } 405f757f3fSDimitry Andric 41*0fca6ea1SDimitry Andric uint32_t AddressableBits::GetHighmemAddressableBits() const { 42*0fca6ea1SDimitry Andric return m_high_memory_addr_bits; 435f757f3fSDimitry Andric } 445f757f3fSDimitry Andric 45*0fca6ea1SDimitry Andric addr_t AddressableBits::AddressableBitToMask(uint32_t addressable_bits) { 46*0fca6ea1SDimitry Andric assert(addressable_bits <= sizeof(addr_t) * 8); 47*0fca6ea1SDimitry Andric if (addressable_bits == 64) 48*0fca6ea1SDimitry Andric return 0; // all bits used for addressing 49*0fca6ea1SDimitry Andric else 50*0fca6ea1SDimitry Andric return ~((1ULL << addressable_bits) - 1); 515f757f3fSDimitry Andric } 52