xref: /freebsd-src/contrib/llvm-project/lldb/source/Utility/AddressableBits.cpp (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
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