1*5f757f3fSDimitry Andric //===-- AddressableBits.cpp -----------------------------------------------===// 2*5f757f3fSDimitry Andric // 3*5f757f3fSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*5f757f3fSDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5*5f757f3fSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*5f757f3fSDimitry Andric // 7*5f757f3fSDimitry Andric //===----------------------------------------------------------------------===// 8*5f757f3fSDimitry Andric 9*5f757f3fSDimitry Andric #include "lldb/Utility/AddressableBits.h" 10*5f757f3fSDimitry Andric #include "lldb/Target/Process.h" 11*5f757f3fSDimitry Andric #include "lldb/lldb-types.h" 12*5f757f3fSDimitry Andric 13*5f757f3fSDimitry Andric using namespace lldb; 14*5f757f3fSDimitry Andric using namespace lldb_private; 15*5f757f3fSDimitry Andric 16*5f757f3fSDimitry Andric void AddressableBits::SetAddressableBits(uint32_t addressing_bits) { 17*5f757f3fSDimitry Andric m_low_memory_addr_bits = m_high_memory_addr_bits = addressing_bits; 18*5f757f3fSDimitry Andric } 19*5f757f3fSDimitry Andric 20*5f757f3fSDimitry Andric void AddressableBits::SetAddressableBits(uint32_t lowmem_addressing_bits, 21*5f757f3fSDimitry Andric uint32_t highmem_addressing_bits) { 22*5f757f3fSDimitry Andric m_low_memory_addr_bits = lowmem_addressing_bits; 23*5f757f3fSDimitry Andric m_high_memory_addr_bits = highmem_addressing_bits; 24*5f757f3fSDimitry Andric } 25*5f757f3fSDimitry Andric 26*5f757f3fSDimitry Andric void AddressableBits::SetLowmemAddressableBits( 27*5f757f3fSDimitry Andric uint32_t lowmem_addressing_bits) { 28*5f757f3fSDimitry Andric m_low_memory_addr_bits = lowmem_addressing_bits; 29*5f757f3fSDimitry Andric } 30*5f757f3fSDimitry Andric 31*5f757f3fSDimitry Andric void AddressableBits::SetHighmemAddressableBits( 32*5f757f3fSDimitry Andric uint32_t highmem_addressing_bits) { 33*5f757f3fSDimitry Andric m_high_memory_addr_bits = highmem_addressing_bits; 34*5f757f3fSDimitry Andric } 35*5f757f3fSDimitry Andric 36*5f757f3fSDimitry Andric void AddressableBits::SetProcessMasks(Process &process) { 37*5f757f3fSDimitry Andric if (m_low_memory_addr_bits == 0 && m_high_memory_addr_bits == 0) 38*5f757f3fSDimitry Andric return; 39*5f757f3fSDimitry Andric 40*5f757f3fSDimitry Andric if (m_low_memory_addr_bits != 0) { 41*5f757f3fSDimitry Andric addr_t low_addr_mask = ~((1ULL << m_low_memory_addr_bits) - 1); 42*5f757f3fSDimitry Andric process.SetCodeAddressMask(low_addr_mask); 43*5f757f3fSDimitry Andric process.SetDataAddressMask(low_addr_mask); 44*5f757f3fSDimitry Andric } 45*5f757f3fSDimitry Andric 46*5f757f3fSDimitry Andric if (m_high_memory_addr_bits != 0) { 47*5f757f3fSDimitry Andric addr_t hi_addr_mask = ~((1ULL << m_high_memory_addr_bits) - 1); 48*5f757f3fSDimitry Andric process.SetHighmemCodeAddressMask(hi_addr_mask); 49*5f757f3fSDimitry Andric process.SetHighmemDataAddressMask(hi_addr_mask); 50*5f757f3fSDimitry Andric } 51*5f757f3fSDimitry Andric } 52