mirror of
https://github.com/RGBCube/serenity
synced 2025-05-28 16:15:10 +00:00
Use uintptr_t instead of u32 when storing pointers as integers
uintptr_t is 32-bit or 64-bit depending on the target platform. This will help us write pointer size agnostic code so that when the day comes that we want to do a 64-bit port, we'll be in better shape.
This commit is contained in:
parent
e07b34b9b8
commit
a246e9cd7e
14 changed files with 110 additions and 110 deletions
|
@ -63,8 +63,8 @@ ACPI_RAW::SDTHeader* ACPIStaticParser::find_table(const char* sig)
|
||||||
dbgprintf("ACPI: Calling Find Table method!\n");
|
dbgprintf("ACPI: Calling Find Table method!\n");
|
||||||
#endif
|
#endif
|
||||||
for (auto* physical_sdt_ptr : m_main_sdt->get_sdt_pointers()) {
|
for (auto* physical_sdt_ptr : m_main_sdt->get_sdt_pointers()) {
|
||||||
auto region = MM.allocate_kernel_region(PhysicalAddress(page_base_of((u32)physical_sdt_ptr)), (PAGE_SIZE * 2), "ACPI Static Parser Tables Finding", Region::Access::Read);
|
auto region = MM.allocate_kernel_region(PhysicalAddress(page_base_of((uintptr_t)physical_sdt_ptr)), (PAGE_SIZE * 2), "ACPI Static Parser Tables Finding", Region::Access::Read);
|
||||||
ACPI_RAW::SDTHeader* sdt = (ACPI_RAW::SDTHeader*)region->vaddr().offset(offset_in_page((u32)physical_sdt_ptr)).as_ptr();
|
ACPI_RAW::SDTHeader* sdt = (ACPI_RAW::SDTHeader*)region->vaddr().offset(offset_in_page((uintptr_t)physical_sdt_ptr)).as_ptr();
|
||||||
#ifdef ACPI_DEBUG
|
#ifdef ACPI_DEBUG
|
||||||
dbgprintf("ACPI: Examining Table @ P 0x%x\n", physical_sdt_ptr);
|
dbgprintf("ACPI: Examining Table @ P 0x%x\n", physical_sdt_ptr);
|
||||||
#endif
|
#endif
|
||||||
|
@ -85,20 +85,20 @@ void ACPIStaticParser::init_fadt()
|
||||||
ASSERT(find_table("FACP") != nullptr);
|
ASSERT(find_table("FACP") != nullptr);
|
||||||
auto* fadt_ptr = find_table("FACP");
|
auto* fadt_ptr = find_table("FACP");
|
||||||
|
|
||||||
auto checkup_region = MM.allocate_kernel_region(PhysicalAddress(page_base_of((u32)(fadt_ptr))), (PAGE_SIZE * 2), "ACPI Static Parser", Region::Access::Read);
|
auto checkup_region = MM.allocate_kernel_region(PhysicalAddress(page_base_of((uintptr_t)(fadt_ptr))), (PAGE_SIZE * 2), "ACPI Static Parser", Region::Access::Read);
|
||||||
#ifdef ACPI_DEBUG
|
#ifdef ACPI_DEBUG
|
||||||
dbgprintf("ACPI: Checking FADT Length to choose the correct mapping size\n");
|
dbgprintf("ACPI: Checking FADT Length to choose the correct mapping size\n");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
ACPI_RAW::SDTHeader* sdt = (ACPI_RAW::SDTHeader*)checkup_region->vaddr().offset(offset_in_page((u32)(fadt_ptr))).as_ptr();
|
ACPI_RAW::SDTHeader* sdt = (ACPI_RAW::SDTHeader*)checkup_region->vaddr().offset(offset_in_page((uintptr_t)(fadt_ptr))).as_ptr();
|
||||||
#ifdef ACPI_DEBUG
|
#ifdef ACPI_DEBUG
|
||||||
dbgprintf("ACPI: FADT @ V 0x%x, P 0x%x\n", sdt, fadt_ptr);
|
dbgprintf("ACPI: FADT @ V 0x%x, P 0x%x\n", sdt, fadt_ptr);
|
||||||
#endif
|
#endif
|
||||||
u32 length = sdt->length;
|
u32 length = sdt->length;
|
||||||
kprintf("ACPI: Fixed ACPI data, Revision %u\n", sdt->revision);
|
kprintf("ACPI: Fixed ACPI data, Revision %u\n", sdt->revision);
|
||||||
|
|
||||||
auto fadt_region = MM.allocate_kernel_region(PhysicalAddress(page_base_of((u32)(fadt_ptr))), PAGE_ROUND_UP(length) + PAGE_SIZE, "ACPI Static Parser", Region::Access::Read);
|
auto fadt_region = MM.allocate_kernel_region(PhysicalAddress(page_base_of((uintptr_t)(fadt_ptr))), PAGE_ROUND_UP(length) + PAGE_SIZE, "ACPI Static Parser", Region::Access::Read);
|
||||||
m_fadt = make<ACPI::FixedACPIData>(*(ACPI_RAW::FADT*)fadt_region->vaddr().offset(offset_in_page((u32)(fadt_ptr))).as_ptr());
|
m_fadt = make<ACPI::FixedACPIData>(*(ACPI_RAW::FADT*)fadt_region->vaddr().offset(offset_in_page((uintptr_t)(fadt_ptr))).as_ptr());
|
||||||
#ifdef ACPI_DEBUG
|
#ifdef ACPI_DEBUG
|
||||||
dbgprintf("ACPI: Finished to initialize Fixed ACPI data\n");
|
dbgprintf("ACPI: Finished to initialize Fixed ACPI data\n");
|
||||||
#endif
|
#endif
|
||||||
|
@ -143,8 +143,8 @@ size_t ACPIStaticParser::get_table_size(ACPI_RAW::SDTHeader& p_header)
|
||||||
#ifdef ACPI_DEBUG
|
#ifdef ACPI_DEBUG
|
||||||
dbgprintf("ACPI: Checking SDT Length\n");
|
dbgprintf("ACPI: Checking SDT Length\n");
|
||||||
#endif
|
#endif
|
||||||
auto region = MM.allocate_kernel_region(PhysicalAddress((u32)&p_header & PAGE_MASK), (PAGE_SIZE * 2), "ACPI get_table_size()", Region::Access::Read);
|
auto region = MM.allocate_kernel_region(PhysicalAddress((uintptr_t)&p_header & PAGE_MASK), (PAGE_SIZE * 2), "ACPI get_table_size()", Region::Access::Read);
|
||||||
volatile auto* sdt = (ACPI_RAW::SDTHeader*)region->vaddr().offset(offset_in_page((u32)&p_header)).as_ptr();
|
volatile auto* sdt = (ACPI_RAW::SDTHeader*)region->vaddr().offset(offset_in_page((uintptr_t)&p_header)).as_ptr();
|
||||||
return sdt->length;
|
return sdt->length;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -154,8 +154,8 @@ u8 ACPIStaticParser::get_table_revision(ACPI_RAW::SDTHeader& p_header)
|
||||||
#ifdef ACPI_DEBUG
|
#ifdef ACPI_DEBUG
|
||||||
dbgprintf("ACPI: Checking SDT Revision\n");
|
dbgprintf("ACPI: Checking SDT Revision\n");
|
||||||
#endif
|
#endif
|
||||||
auto region = MM.allocate_kernel_region(PhysicalAddress((u32)&p_header & PAGE_MASK), (PAGE_SIZE * 2), "ACPI get_table_revision()", Region::Access::Read);
|
auto region = MM.allocate_kernel_region(PhysicalAddress((uintptr_t)&p_header & PAGE_MASK), (PAGE_SIZE * 2), "ACPI get_table_revision()", Region::Access::Read);
|
||||||
volatile auto* sdt = (ACPI_RAW::SDTHeader*)region->vaddr().offset(offset_in_page((u32)&p_header)).as_ptr();
|
volatile auto* sdt = (ACPI_RAW::SDTHeader*)region->vaddr().offset(offset_in_page((uintptr_t)&p_header)).as_ptr();
|
||||||
return sdt->revision;
|
return sdt->revision;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -175,8 +175,8 @@ void ACPIStaticParser::initialize_main_system_description_table()
|
||||||
revision = get_table_revision(*m_main_system_description_table);
|
revision = get_table_revision(*m_main_system_description_table);
|
||||||
}
|
}
|
||||||
|
|
||||||
auto main_sdt_region = MM.allocate_kernel_region(PhysicalAddress(page_base_of((u32)m_main_system_description_table)), PAGE_ROUND_UP(length) + PAGE_SIZE, "ACPI Static Parser Initialization", Region::Access::Read, false, true);
|
auto main_sdt_region = MM.allocate_kernel_region(PhysicalAddress(page_base_of((uintptr_t)m_main_system_description_table)), PAGE_ROUND_UP(length) + PAGE_SIZE, "ACPI Static Parser Initialization", Region::Access::Read, false, true);
|
||||||
volatile auto* sdt = (ACPI_RAW::SDTHeader*)main_sdt_region->vaddr().offset(offset_in_page((u32)m_main_system_description_table)).as_ptr();
|
volatile auto* sdt = (ACPI_RAW::SDTHeader*)main_sdt_region->vaddr().offset(offset_in_page((uintptr_t)m_main_system_description_table)).as_ptr();
|
||||||
kprintf("ACPI: Main Description Table valid? 0x%x\n", validate_acpi_table(const_cast<ACPI_RAW::SDTHeader&>(*sdt), length));
|
kprintf("ACPI: Main Description Table valid? 0x%x\n", validate_acpi_table(const_cast<ACPI_RAW::SDTHeader&>(*sdt), length));
|
||||||
|
|
||||||
Vector<ACPI_RAW::SDTHeader*> sdt_pointers;
|
Vector<ACPI_RAW::SDTHeader*> sdt_pointers;
|
||||||
|
@ -236,8 +236,8 @@ void ACPIStaticParser::locate_all_aml_tables()
|
||||||
kprintf("ACPI: Searching for AML Tables\n");
|
kprintf("ACPI: Searching for AML Tables\n");
|
||||||
m_aml_tables_ptrs.append(m_fadt->get_dsdt());
|
m_aml_tables_ptrs.append(m_fadt->get_dsdt());
|
||||||
for (auto* sdt_ptr : m_main_sdt->get_sdt_pointers()) {
|
for (auto* sdt_ptr : m_main_sdt->get_sdt_pointers()) {
|
||||||
auto region = MM.allocate_kernel_region(PhysicalAddress(page_base_of((u32)sdt_ptr)), (PAGE_SIZE * 2), "ACPI Static Parser AML Tables Finding", Region::Access::Read);
|
auto region = MM.allocate_kernel_region(PhysicalAddress(page_base_of((uintptr_t)sdt_ptr)), (PAGE_SIZE * 2), "ACPI Static Parser AML Tables Finding", Region::Access::Read);
|
||||||
auto* sdt = (ACPI_RAW::SDTHeader*)region->vaddr().offset(offset_in_page((u32)sdt_ptr)).as_ptr();
|
auto* sdt = (ACPI_RAW::SDTHeader*)region->vaddr().offset(offset_in_page((uintptr_t)sdt_ptr)).as_ptr();
|
||||||
#ifdef ACPI_DEBUG
|
#ifdef ACPI_DEBUG
|
||||||
dbgprintf("ACPI: Examining Table @ P 0x%x\n", sdt_ptr);
|
dbgprintf("ACPI: Examining Table @ P 0x%x\n", sdt_ptr);
|
||||||
#endif
|
#endif
|
||||||
|
@ -387,7 +387,7 @@ ACPI::FixedACPIData::FixedACPIData(ACPI_RAW::FADT& fadt)
|
||||||
|
|
||||||
ACPI_RAW::SDTHeader* ACPI::FixedACPIData::get_dsdt()
|
ACPI_RAW::SDTHeader* ACPI::FixedACPIData::get_dsdt()
|
||||||
{
|
{
|
||||||
if (m_x_dsdt_ptr != (u32) nullptr)
|
if (m_x_dsdt_ptr != (uintptr_t) nullptr)
|
||||||
return (ACPI_RAW::SDTHeader*)m_x_dsdt_ptr;
|
return (ACPI_RAW::SDTHeader*)m_x_dsdt_ptr;
|
||||||
else {
|
else {
|
||||||
ASSERT((ACPI_RAW::SDTHeader*)m_dsdt_ptr != nullptr);
|
ASSERT((ACPI_RAW::SDTHeader*)m_dsdt_ptr != nullptr);
|
||||||
|
|
|
@ -90,10 +90,10 @@ void DMIDecoder::enumerate_smbios_tables()
|
||||||
u32 table_length = m_table_length;
|
u32 table_length = m_table_length;
|
||||||
SMBIOS::TableHeader* p_table_ptr = m_structure_table;
|
SMBIOS::TableHeader* p_table_ptr = m_structure_table;
|
||||||
|
|
||||||
PhysicalAddress paddr = PhysicalAddress(page_base_of((u32)p_table_ptr));
|
PhysicalAddress paddr = PhysicalAddress(page_base_of((uintptr_t)p_table_ptr));
|
||||||
auto region = MM.allocate_kernel_region(paddr, PAGE_ROUND_UP(table_length), "DMI Decoder Enumerating SMBIOS", Region::Access::Read, false, false);
|
auto region = MM.allocate_kernel_region(paddr, PAGE_ROUND_UP(table_length), "DMI Decoder Enumerating SMBIOS", Region::Access::Read, false, false);
|
||||||
|
|
||||||
volatile SMBIOS::TableHeader* v_table_ptr = (SMBIOS::TableHeader*)region->vaddr().offset(offset_in_page((u32)p_table_ptr)).as_ptr();
|
volatile SMBIOS::TableHeader* v_table_ptr = (SMBIOS::TableHeader*)region->vaddr().offset(offset_in_page((uintptr_t)p_table_ptr)).as_ptr();
|
||||||
#ifdef SMBIOS_DEBUG
|
#ifdef SMBIOS_DEBUG
|
||||||
dbgprintf("DMIDecoder: Total Table length %d\n", m_table_length);
|
dbgprintf("DMIDecoder: Total Table length %d\n", m_table_length);
|
||||||
#endif
|
#endif
|
||||||
|
@ -104,7 +104,7 @@ void DMIDecoder::enumerate_smbios_tables()
|
||||||
dbgprintf("DMIDecoder: Examining table @ P 0x%x V 0x%x\n", p_table_ptr, v_table_ptr);
|
dbgprintf("DMIDecoder: Examining table @ P 0x%x V 0x%x\n", p_table_ptr, v_table_ptr);
|
||||||
#endif
|
#endif
|
||||||
structures_count++;
|
structures_count++;
|
||||||
if (v_table_ptr->type == (u32)SMBIOS::TableType::EndOfTable) {
|
if (v_table_ptr->type == (u8)SMBIOS::TableType::EndOfTable) {
|
||||||
kprintf("DMIDecoder: Detected table with type 127, End of SMBIOS data.\n");
|
kprintf("DMIDecoder: Detected table with type 127, End of SMBIOS data.\n");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -113,8 +113,8 @@ void DMIDecoder::enumerate_smbios_tables()
|
||||||
table_length -= v_table_ptr->length;
|
table_length -= v_table_ptr->length;
|
||||||
|
|
||||||
size_t table_size = get_table_size(*p_table_ptr);
|
size_t table_size = get_table_size(*p_table_ptr);
|
||||||
p_table_ptr = (SMBIOS::TableHeader*)((u32)p_table_ptr + (u32)table_size);
|
p_table_ptr = (SMBIOS::TableHeader*)((uintptr_t)p_table_ptr + table_size);
|
||||||
v_table_ptr = (SMBIOS::TableHeader*)((u32)v_table_ptr + (u32)table_size);
|
v_table_ptr = (SMBIOS::TableHeader*)((uintptr_t)v_table_ptr + table_size);
|
||||||
#ifdef SMBIOS_DEBUG
|
#ifdef SMBIOS_DEBUG
|
||||||
dbgprintf("DMIDecoder: Next table @ P 0x%x\n", p_table_ptr);
|
dbgprintf("DMIDecoder: Next table @ P 0x%x\n", p_table_ptr);
|
||||||
#endif
|
#endif
|
||||||
|
@ -146,7 +146,7 @@ size_t DMIDecoder::get_table_size(SMBIOS::TableHeader& table)
|
||||||
|
|
||||||
SMBIOS::TableHeader* DMIDecoder::get_next_physical_table(SMBIOS::TableHeader& p_table)
|
SMBIOS::TableHeader* DMIDecoder::get_next_physical_table(SMBIOS::TableHeader& p_table)
|
||||||
{
|
{
|
||||||
return (SMBIOS::TableHeader*)((u32)&p_table + get_table_size(p_table));
|
return (SMBIOS::TableHeader*)((uintptr_t)&p_table + get_table_size(p_table));
|
||||||
}
|
}
|
||||||
|
|
||||||
SMBIOS::TableHeader* DMIDecoder::get_smbios_physical_table_by_handle(u16 handle)
|
SMBIOS::TableHeader* DMIDecoder::get_smbios_physical_table_by_handle(u16 handle)
|
||||||
|
@ -155,8 +155,8 @@ SMBIOS::TableHeader* DMIDecoder::get_smbios_physical_table_by_handle(u16 handle)
|
||||||
for (auto* table : m_smbios_tables) {
|
for (auto* table : m_smbios_tables) {
|
||||||
if (!table)
|
if (!table)
|
||||||
continue;
|
continue;
|
||||||
auto region = MM.allocate_kernel_region(PhysicalAddress(page_base_of((u32)table)), PAGE_SIZE * 2, "DMI Decoder Finding Table", Region::Access::Read, false, false);
|
auto region = MM.allocate_kernel_region(PhysicalAddress(page_base_of((uintptr_t)table)), PAGE_SIZE * 2, "DMI Decoder Finding Table", Region::Access::Read, false, false);
|
||||||
SMBIOS::TableHeader* table_v_ptr = (SMBIOS::TableHeader*)region->vaddr().offset(offset_in_page((u32)table)).as_ptr();
|
SMBIOS::TableHeader* table_v_ptr = (SMBIOS::TableHeader*)region->vaddr().offset(offset_in_page((uintptr_t)table)).as_ptr();
|
||||||
|
|
||||||
if (table_v_ptr->handle == handle) {
|
if (table_v_ptr->handle == handle) {
|
||||||
return table;
|
return table;
|
||||||
|
@ -170,8 +170,8 @@ SMBIOS::TableHeader* DMIDecoder::get_smbios_physical_table_by_type(u8 table_type
|
||||||
for (auto* table : m_smbios_tables) {
|
for (auto* table : m_smbios_tables) {
|
||||||
if (!table)
|
if (!table)
|
||||||
continue;
|
continue;
|
||||||
auto region = MM.allocate_kernel_region(PhysicalAddress(page_base_of((u32)table)), PAGE_ROUND_UP(PAGE_SIZE * 2), "DMI Decoder Finding Table", Region::Access::Read, false, false);
|
auto region = MM.allocate_kernel_region(PhysicalAddress(page_base_of((uintptr_t)table)), PAGE_ROUND_UP(PAGE_SIZE * 2), "DMI Decoder Finding Table", Region::Access::Read, false, false);
|
||||||
SMBIOS::TableHeader* table_v_ptr = (SMBIOS::TableHeader*)region->vaddr().offset(offset_in_page((u32)table)).as_ptr();
|
SMBIOS::TableHeader* table_v_ptr = (SMBIOS::TableHeader*)region->vaddr().offset(offset_in_page((uintptr_t)table)).as_ptr();
|
||||||
if (table_v_ptr->type == table_type) {
|
if (table_v_ptr->type == table_type) {
|
||||||
return table;
|
return table;
|
||||||
}
|
}
|
||||||
|
|
|
@ -201,7 +201,7 @@ struct GenericAddressStructure {
|
||||||
this->bit_width = other.bit_width;
|
this->bit_width = other.bit_width;
|
||||||
this->bit_offset = other.bit_offset;
|
this->bit_offset = other.bit_offset;
|
||||||
this->access_size = other.access_size;
|
this->access_size = other.access_size;
|
||||||
this->address = (u32)other.address;
|
this->address = (uintptr_t)other.address;
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
GenericAddressStructure& operator=(const ACPI_RAW::GenericAddressStructure& other)
|
GenericAddressStructure& operator=(const ACPI_RAW::GenericAddressStructure& other)
|
||||||
|
@ -210,7 +210,7 @@ struct GenericAddressStructure {
|
||||||
this->bit_width = other.bit_width;
|
this->bit_width = other.bit_width;
|
||||||
this->bit_offset = other.bit_offset;
|
this->bit_offset = other.bit_offset;
|
||||||
this->access_size = other.access_size;
|
this->access_size = other.access_size;
|
||||||
this->address = (u32)other.address;
|
this->address = (uintptr_t)other.address;
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -33,7 +33,7 @@
|
||||||
#include <Kernel/kstdio.h>
|
#include <Kernel/kstdio.h>
|
||||||
|
|
||||||
#define PAGE_SIZE 4096
|
#define PAGE_SIZE 4096
|
||||||
#define PAGE_MASK 0xfffff000
|
#define PAGE_MASK ((uintptr_t)0xfffff000u)
|
||||||
|
|
||||||
class MemoryManager;
|
class MemoryManager;
|
||||||
class PageDirectory;
|
class PageDirectory;
|
||||||
|
@ -452,12 +452,12 @@ struct [[gnu::aligned(16)]] FPUState
|
||||||
u8 buffer[512];
|
u8 buffer[512];
|
||||||
};
|
};
|
||||||
|
|
||||||
inline constexpr u32 page_base_of(u32 address)
|
inline constexpr uintptr_t page_base_of(uintptr_t address)
|
||||||
{
|
{
|
||||||
return address & PAGE_MASK;
|
return address & PAGE_MASK;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline constexpr u32 offset_in_page(u32 address)
|
inline constexpr uintptr_t offset_in_page(uintptr_t address)
|
||||||
{
|
{
|
||||||
return address & (~PAGE_MASK);
|
return address & (~PAGE_MASK);
|
||||||
}
|
}
|
||||||
|
|
|
@ -134,13 +134,13 @@ static void load_ksyms_from_data(const ByteBuffer& buffer)
|
||||||
int recognized_symbol_count = 0;
|
int recognized_symbol_count = 0;
|
||||||
if (use_ksyms) {
|
if (use_ksyms) {
|
||||||
for (u32* stack_ptr = (u32*)ebp;
|
for (u32* stack_ptr = (u32*)ebp;
|
||||||
(current ? current->process().validate_read_from_kernel(VirtualAddress((u32)stack_ptr), sizeof(void*) * 2) : 1) && recognized_symbol_count < max_recognized_symbol_count; stack_ptr = (u32*)*stack_ptr) {
|
(current ? current->process().validate_read_from_kernel(VirtualAddress((uintptr_t)stack_ptr), sizeof(void*) * 2) : 1) && recognized_symbol_count < max_recognized_symbol_count; stack_ptr = (u32*)*stack_ptr) {
|
||||||
u32 retaddr = stack_ptr[1];
|
u32 retaddr = stack_ptr[1];
|
||||||
recognized_symbols[recognized_symbol_count++] = { retaddr, ksymbolicate(retaddr) };
|
recognized_symbols[recognized_symbol_count++] = { retaddr, ksymbolicate(retaddr) };
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
for (u32* stack_ptr = (u32*)ebp;
|
for (u32* stack_ptr = (u32*)ebp;
|
||||||
(current ? current->process().validate_read_from_kernel(VirtualAddress((u32)stack_ptr), sizeof(void*) * 2) : 1); stack_ptr = (u32*)*stack_ptr) {
|
(current ? current->process().validate_read_from_kernel(VirtualAddress((uintptr_t)stack_ptr), sizeof(void*) * 2) : 1); stack_ptr = (u32*)*stack_ptr) {
|
||||||
u32 retaddr = stack_ptr[1];
|
u32 retaddr = stack_ptr[1];
|
||||||
dbgprintf("%x (next: %x)\n", retaddr, stack_ptr ? (u32*)*stack_ptr : 0);
|
dbgprintf("%x (next: %x)\n", retaddr, stack_ptr ? (u32*)*stack_ptr : 0);
|
||||||
}
|
}
|
||||||
|
|
|
@ -253,14 +253,14 @@ bool E1000NetworkAdapter::link_up()
|
||||||
|
|
||||||
void E1000NetworkAdapter::initialize_rx_descriptors()
|
void E1000NetworkAdapter::initialize_rx_descriptors()
|
||||||
{
|
{
|
||||||
auto ptr = (u32)kmalloc_eternal(sizeof(e1000_rx_desc) * number_of_rx_descriptors + 16);
|
auto ptr = (uintptr_t)kmalloc_eternal(sizeof(e1000_rx_desc) * number_of_rx_descriptors + 16);
|
||||||
// Make sure it's 16-byte aligned.
|
// Make sure it's 16-byte aligned.
|
||||||
if (ptr % 16)
|
if (ptr % 16)
|
||||||
ptr = (ptr + 16) - (ptr % 16);
|
ptr = (ptr + 16) - (ptr % 16);
|
||||||
m_rx_descriptors = (e1000_rx_desc*)ptr;
|
m_rx_descriptors = (e1000_rx_desc*)ptr;
|
||||||
for (int i = 0; i < number_of_rx_descriptors; ++i) {
|
for (int i = 0; i < number_of_rx_descriptors; ++i) {
|
||||||
auto& descriptor = m_rx_descriptors[i];
|
auto& descriptor = m_rx_descriptors[i];
|
||||||
auto addr = (u32)kmalloc_eternal(8192 + 16);
|
auto addr = (uintptr_t)kmalloc_eternal(8192 + 16);
|
||||||
if (addr % 16)
|
if (addr % 16)
|
||||||
addr = (addr + 16) - (addr % 16);
|
addr = (addr + 16) - (addr % 16);
|
||||||
descriptor.addr = addr - 0xc0000000;
|
descriptor.addr = addr - 0xc0000000;
|
||||||
|
@ -278,14 +278,14 @@ void E1000NetworkAdapter::initialize_rx_descriptors()
|
||||||
|
|
||||||
void E1000NetworkAdapter::initialize_tx_descriptors()
|
void E1000NetworkAdapter::initialize_tx_descriptors()
|
||||||
{
|
{
|
||||||
auto ptr = (u32)kmalloc_eternal(sizeof(e1000_tx_desc) * number_of_tx_descriptors + 16);
|
auto ptr = (uintptr_t)kmalloc_eternal(sizeof(e1000_tx_desc) * number_of_tx_descriptors + 16);
|
||||||
// Make sure it's 16-byte aligned.
|
// Make sure it's 16-byte aligned.
|
||||||
if (ptr % 16)
|
if (ptr % 16)
|
||||||
ptr = (ptr + 16) - (ptr % 16);
|
ptr = (ptr + 16) - (ptr % 16);
|
||||||
m_tx_descriptors = (e1000_tx_desc*)ptr;
|
m_tx_descriptors = (e1000_tx_desc*)ptr;
|
||||||
for (int i = 0; i < number_of_tx_descriptors; ++i) {
|
for (int i = 0; i < number_of_tx_descriptors; ++i) {
|
||||||
auto& descriptor = m_tx_descriptors[i];
|
auto& descriptor = m_tx_descriptors[i];
|
||||||
auto addr = (u32)kmalloc_eternal(8192 + 16);
|
auto addr = (uintptr_t)kmalloc_eternal(8192 + 16);
|
||||||
if (addr % 16)
|
if (addr % 16)
|
||||||
addr = (addr + 16) - (addr % 16);
|
addr = (addr + 16) - (addr % 16);
|
||||||
descriptor.addr = addr - 0xc0000000;
|
descriptor.addr = addr - 0xc0000000;
|
||||||
|
|
|
@ -157,16 +157,16 @@ RTL8139NetworkAdapter::RTL8139NetworkAdapter(PCI::Address pci_address, u8 irq)
|
||||||
// we add space to account for overhang from the last packet - the rtl8139
|
// we add space to account for overhang from the last packet - the rtl8139
|
||||||
// can optionally guarantee that packets will be contiguous by
|
// can optionally guarantee that packets will be contiguous by
|
||||||
// purposefully overrunning the rx buffer
|
// purposefully overrunning the rx buffer
|
||||||
m_rx_buffer_addr = (u32)virtual_to_low_physical(kmalloc_aligned(RX_BUFFER_SIZE + PACKET_SIZE_MAX, 16));
|
m_rx_buffer_addr = (uintptr_t)virtual_to_low_physical(kmalloc_aligned(RX_BUFFER_SIZE + PACKET_SIZE_MAX, 16));
|
||||||
kprintf("RTL8139: RX buffer: P%p\n", m_rx_buffer_addr);
|
kprintf("RTL8139: RX buffer: P%p\n", m_rx_buffer_addr);
|
||||||
|
|
||||||
auto tx_buffer_addr = (u32)virtual_to_low_physical(kmalloc_aligned(TX_BUFFER_SIZE * 4, 16));
|
auto tx_buffer_addr = (uintptr_t)virtual_to_low_physical(kmalloc_aligned(TX_BUFFER_SIZE * 4, 16));
|
||||||
for (int i = 0; i < RTL8139_TX_BUFFER_COUNT; i++) {
|
for (int i = 0; i < RTL8139_TX_BUFFER_COUNT; i++) {
|
||||||
m_tx_buffer_addr[i] = tx_buffer_addr + TX_BUFFER_SIZE * i;
|
m_tx_buffer_addr[i] = tx_buffer_addr + TX_BUFFER_SIZE * i;
|
||||||
kprintf("RTL8139: TX buffer %d: P%p\n", i, m_tx_buffer_addr[i]);
|
kprintf("RTL8139: TX buffer %d: P%p\n", i, m_tx_buffer_addr[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
m_packet_buffer = (u32)kmalloc(PACKET_SIZE_MAX);
|
m_packet_buffer = (uintptr_t)kmalloc(PACKET_SIZE_MAX);
|
||||||
|
|
||||||
reset();
|
reset();
|
||||||
|
|
||||||
|
|
|
@ -274,7 +274,7 @@ int Process::sys$set_mmap_name(const Syscall::SC_set_mmap_name_params* user_para
|
||||||
if (name.is_null())
|
if (name.is_null())
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
|
||||||
auto* region = region_from_range({ VirtualAddress((u32)params.addr), params.size });
|
auto* region = region_from_range({ VirtualAddress((uintptr_t)params.addr), params.size });
|
||||||
if (!region)
|
if (!region)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
if (!region->is_mmap())
|
if (!region->is_mmap())
|
||||||
|
@ -364,7 +364,7 @@ void* Process::sys$mmap(const Syscall::SC_mmap_params* user_params)
|
||||||
|
|
||||||
if (size == 0)
|
if (size == 0)
|
||||||
return (void*)-EINVAL;
|
return (void*)-EINVAL;
|
||||||
if ((u32)addr & ~PAGE_MASK)
|
if ((uintptr_t)addr & ~PAGE_MASK)
|
||||||
return (void*)-EINVAL;
|
return (void*)-EINVAL;
|
||||||
|
|
||||||
bool map_shared = flags & MAP_SHARED;
|
bool map_shared = flags & MAP_SHARED;
|
||||||
|
@ -390,11 +390,11 @@ void* Process::sys$mmap(const Syscall::SC_mmap_params* user_params)
|
||||||
|
|
||||||
if (map_purgeable) {
|
if (map_purgeable) {
|
||||||
auto vmobject = PurgeableVMObject::create_with_size(size);
|
auto vmobject = PurgeableVMObject::create_with_size(size);
|
||||||
region = allocate_region_with_vmobject(VirtualAddress((u32)addr), size, vmobject, 0, !name.is_null() ? name : "mmap (purgeable)", prot);
|
region = allocate_region_with_vmobject(VirtualAddress((uintptr_t)addr), size, vmobject, 0, !name.is_null() ? name : "mmap (purgeable)", prot);
|
||||||
if (!region && (!map_fixed && addr != 0))
|
if (!region && (!map_fixed && addr != 0))
|
||||||
region = allocate_region_with_vmobject({}, size, vmobject, 0, !name.is_null() ? name : "mmap (purgeable)", prot);
|
region = allocate_region_with_vmobject({}, size, vmobject, 0, !name.is_null() ? name : "mmap (purgeable)", prot);
|
||||||
} else if (map_anonymous) {
|
} else if (map_anonymous) {
|
||||||
region = allocate_region(VirtualAddress((u32)addr), size, !name.is_null() ? name : "mmap", prot, false);
|
region = allocate_region(VirtualAddress((uintptr_t)addr), size, !name.is_null() ? name : "mmap", prot, false);
|
||||||
if (!region && (!map_fixed && addr != 0))
|
if (!region && (!map_fixed && addr != 0))
|
||||||
region = allocate_region({}, size, !name.is_null() ? name : "mmap", prot, false);
|
region = allocate_region({}, size, !name.is_null() ? name : "mmap", prot, false);
|
||||||
} else {
|
} else {
|
||||||
|
@ -418,7 +418,7 @@ void* Process::sys$mmap(const Syscall::SC_mmap_params* user_params)
|
||||||
if (!validate_inode_mmap_prot(*this, prot, *description->inode()))
|
if (!validate_inode_mmap_prot(*this, prot, *description->inode()))
|
||||||
return (void*)-EACCES;
|
return (void*)-EACCES;
|
||||||
}
|
}
|
||||||
auto region_or_error = description->mmap(*this, VirtualAddress((u32)addr), static_cast<size_t>(offset), size, prot);
|
auto region_or_error = description->mmap(*this, VirtualAddress((uintptr_t)addr), static_cast<size_t>(offset), size, prot);
|
||||||
if (region_or_error.is_error()) {
|
if (region_or_error.is_error()) {
|
||||||
// Fail if MAP_FIXED or address is 0, retry otherwise
|
// Fail if MAP_FIXED or address is 0, retry otherwise
|
||||||
if (map_fixed || addr == 0)
|
if (map_fixed || addr == 0)
|
||||||
|
@ -445,7 +445,7 @@ void* Process::sys$mmap(const Syscall::SC_mmap_params* user_params)
|
||||||
int Process::sys$munmap(void* addr, size_t size)
|
int Process::sys$munmap(void* addr, size_t size)
|
||||||
{
|
{
|
||||||
REQUIRE_PROMISE(stdio);
|
REQUIRE_PROMISE(stdio);
|
||||||
Range range_to_unmap { VirtualAddress((u32)addr), size };
|
Range range_to_unmap { VirtualAddress((uintptr_t)addr), size };
|
||||||
if (auto* whole_region = region_from_range(range_to_unmap)) {
|
if (auto* whole_region = region_from_range(range_to_unmap)) {
|
||||||
if (!whole_region->is_mmap())
|
if (!whole_region->is_mmap())
|
||||||
return -EPERM;
|
return -EPERM;
|
||||||
|
@ -482,7 +482,7 @@ int Process::sys$munmap(void* addr, size_t size)
|
||||||
int Process::sys$mprotect(void* addr, size_t size, int prot)
|
int Process::sys$mprotect(void* addr, size_t size, int prot)
|
||||||
{
|
{
|
||||||
REQUIRE_PROMISE(stdio);
|
REQUIRE_PROMISE(stdio);
|
||||||
Range range_to_mprotect = { VirtualAddress((u32)addr), size };
|
Range range_to_mprotect = { VirtualAddress((uintptr_t)addr), size };
|
||||||
|
|
||||||
if (auto* whole_region = region_from_range(range_to_mprotect)) {
|
if (auto* whole_region = region_from_range(range_to_mprotect)) {
|
||||||
if (!whole_region->is_mmap())
|
if (!whole_region->is_mmap())
|
||||||
|
@ -545,7 +545,7 @@ int Process::sys$mprotect(void* addr, size_t size, int prot)
|
||||||
int Process::sys$madvise(void* address, size_t size, int advice)
|
int Process::sys$madvise(void* address, size_t size, int advice)
|
||||||
{
|
{
|
||||||
REQUIRE_PROMISE(stdio);
|
REQUIRE_PROMISE(stdio);
|
||||||
auto* region = region_from_range({ VirtualAddress((u32)address), size });
|
auto* region = region_from_range({ VirtualAddress((uintptr_t)address), size });
|
||||||
if (!region)
|
if (!region)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
if (!region->is_mmap())
|
if (!region->is_mmap())
|
||||||
|
@ -1219,7 +1219,7 @@ Process* Process::create_user_process(Thread*& first_thread, const String& path,
|
||||||
Process* Process::create_kernel_process(Thread*& first_thread, String&& name, void (*e)())
|
Process* Process::create_kernel_process(Thread*& first_thread, String&& name, void (*e)())
|
||||||
{
|
{
|
||||||
auto* process = new Process(first_thread, move(name), (uid_t)0, (gid_t)0, (pid_t)0, Ring0);
|
auto* process = new Process(first_thread, move(name), (uid_t)0, (gid_t)0, (pid_t)0, Ring0);
|
||||||
first_thread->tss().eip = (u32)e;
|
first_thread->tss().eip = (uintptr_t)e;
|
||||||
|
|
||||||
if (process->pid() != 0) {
|
if (process->pid() != 0) {
|
||||||
InterruptDisabler disabler;
|
InterruptDisabler disabler;
|
||||||
|
@ -1415,7 +1415,7 @@ int Process::sys$sigreturn(RegisterDump& registers)
|
||||||
stack_ptr++;
|
stack_ptr++;
|
||||||
|
|
||||||
//pop edi, esi, ebp, esp, ebx, edx, ecx and eax
|
//pop edi, esi, ebp, esp, ebx, edx, ecx and eax
|
||||||
memcpy(®isters.edi, stack_ptr, 8 * sizeof(u32));
|
memcpy(®isters.edi, stack_ptr, 8 * sizeof(uintptr_t));
|
||||||
stack_ptr += 8;
|
stack_ptr += 8;
|
||||||
|
|
||||||
registers.eip = *stack_ptr;
|
registers.eip = *stack_ptr;
|
||||||
|
@ -2356,7 +2356,7 @@ bool Process::validate_read_from_kernel(VirtualAddress vaddr, ssize_t size) cons
|
||||||
bool Process::validate_read(const void* address, ssize_t size) const
|
bool Process::validate_read(const void* address, ssize_t size) const
|
||||||
{
|
{
|
||||||
ASSERT(size >= 0);
|
ASSERT(size >= 0);
|
||||||
VirtualAddress first_address((u32)address);
|
VirtualAddress first_address((uintptr_t)address);
|
||||||
if (is_ring0()) {
|
if (is_ring0()) {
|
||||||
if (is_kmalloc_address(address))
|
if (is_kmalloc_address(address))
|
||||||
return true;
|
return true;
|
||||||
|
@ -2369,7 +2369,7 @@ bool Process::validate_read(const void* address, ssize_t size) const
|
||||||
bool Process::validate_write(void* address, ssize_t size) const
|
bool Process::validate_write(void* address, ssize_t size) const
|
||||||
{
|
{
|
||||||
ASSERT(size >= 0);
|
ASSERT(size >= 0);
|
||||||
VirtualAddress first_address((u32)address);
|
VirtualAddress first_address((uintptr_t)address);
|
||||||
if (is_ring0()) {
|
if (is_ring0()) {
|
||||||
if (is_kmalloc_address(address))
|
if (is_kmalloc_address(address))
|
||||||
return true;
|
return true;
|
||||||
|
@ -3632,13 +3632,13 @@ int Process::sys$create_thread(void* (*entry)(void*), void* argument, const Sysc
|
||||||
thread->set_joinable(is_thread_joinable);
|
thread->set_joinable(is_thread_joinable);
|
||||||
|
|
||||||
auto& tss = thread->tss();
|
auto& tss = thread->tss();
|
||||||
tss.eip = (u32)entry;
|
tss.eip = (uintptr_t)entry;
|
||||||
tss.eflags = 0x0202;
|
tss.eflags = 0x0202;
|
||||||
tss.cr3 = page_directory().cr3();
|
tss.cr3 = page_directory().cr3();
|
||||||
tss.esp = user_stack_address;
|
tss.esp = user_stack_address;
|
||||||
|
|
||||||
// NOTE: The stack needs to be 16-byte aligned.
|
// NOTE: The stack needs to be 16-byte aligned.
|
||||||
thread->push_value_on_stack((u32)argument);
|
thread->push_value_on_stack((uintptr_t)argument);
|
||||||
thread->push_value_on_stack(0);
|
thread->push_value_on_stack(0);
|
||||||
|
|
||||||
thread->make_thread_specific_region({});
|
thread->make_thread_specific_region({});
|
||||||
|
@ -4399,7 +4399,7 @@ Thread& Process::any_thread()
|
||||||
|
|
||||||
WaitQueue& Process::futex_queue(i32* userspace_address)
|
WaitQueue& Process::futex_queue(i32* userspace_address)
|
||||||
{
|
{
|
||||||
auto& queue = m_futex_queues.ensure((u32)userspace_address);
|
auto& queue = m_futex_queues.ensure((uintptr_t)userspace_address);
|
||||||
if (!queue)
|
if (!queue)
|
||||||
queue = make<WaitQueue>();
|
queue = make<WaitQueue>();
|
||||||
return *queue;
|
return *queue;
|
||||||
|
|
|
@ -597,8 +597,8 @@ void Thread::set_default_signal_dispositions()
|
||||||
{
|
{
|
||||||
// FIXME: Set up all the right default actions. See signal(7).
|
// FIXME: Set up all the right default actions. See signal(7).
|
||||||
memset(&m_signal_action_data, 0, sizeof(m_signal_action_data));
|
memset(&m_signal_action_data, 0, sizeof(m_signal_action_data));
|
||||||
m_signal_action_data[SIGCHLD].handler_or_sigaction = VirtualAddress((u32)SIG_IGN);
|
m_signal_action_data[SIGCHLD].handler_or_sigaction = VirtualAddress((uintptr_t)SIG_IGN);
|
||||||
m_signal_action_data[SIGWINCH].handler_or_sigaction = VirtualAddress((u32)SIG_IGN);
|
m_signal_action_data[SIGWINCH].handler_or_sigaction = VirtualAddress((uintptr_t)SIG_IGN);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Thread::push_value_on_stack(u32 value)
|
void Thread::push_value_on_stack(u32 value)
|
||||||
|
@ -657,9 +657,9 @@ u32 Thread::make_userspace_stack_for_main_thread(Vector<String> arguments, Vecto
|
||||||
};
|
};
|
||||||
|
|
||||||
// NOTE: The stack needs to be 16-byte aligned.
|
// NOTE: The stack needs to be 16-byte aligned.
|
||||||
push_on_new_stack((u32)env);
|
push_on_new_stack((uintptr_t)env);
|
||||||
push_on_new_stack((u32)argv);
|
push_on_new_stack((uintptr_t)argv);
|
||||||
push_on_new_stack((u32)argc);
|
push_on_new_stack((uintptr_t)argc);
|
||||||
push_on_new_stack(0);
|
push_on_new_stack(0);
|
||||||
return new_esp;
|
return new_esp;
|
||||||
}
|
}
|
||||||
|
@ -770,20 +770,20 @@ String Thread::backtrace_impl() const
|
||||||
auto& process = const_cast<Process&>(this->process());
|
auto& process = const_cast<Process&>(this->process());
|
||||||
ProcessPagingScope paging_scope(process);
|
ProcessPagingScope paging_scope(process);
|
||||||
|
|
||||||
u32 stack_ptr = start_frame;
|
uintptr_t stack_ptr = start_frame;
|
||||||
for (;;) {
|
for (;;) {
|
||||||
if (!process.validate_read_from_kernel(VirtualAddress((u32)stack_ptr), sizeof(void*) * 2))
|
if (!process.validate_read_from_kernel(VirtualAddress((uintptr_t)stack_ptr), sizeof(void*) * 2))
|
||||||
break;
|
break;
|
||||||
u32 retaddr;
|
uintptr_t retaddr;
|
||||||
|
|
||||||
if (is_user_range(VirtualAddress(stack_ptr), sizeof(void*) * 2)) {
|
if (is_user_range(VirtualAddress(stack_ptr), sizeof(uintptr_t) * 2)) {
|
||||||
copy_from_user(&retaddr, &((u32*)stack_ptr)[1]);
|
copy_from_user(&retaddr, &((uintptr_t*)stack_ptr)[1]);
|
||||||
recognized_symbols.append({ retaddr, ksymbolicate(retaddr) });
|
recognized_symbols.append({ retaddr, ksymbolicate(retaddr) });
|
||||||
copy_from_user(&stack_ptr, (u32*)stack_ptr);
|
copy_from_user(&stack_ptr, (uintptr_t*)stack_ptr);
|
||||||
} else {
|
} else {
|
||||||
memcpy(&retaddr, &((u32*)stack_ptr)[1], sizeof(void*));
|
memcpy(&retaddr, &((uintptr_t*)stack_ptr)[1], sizeof(uintptr_t));
|
||||||
recognized_symbols.append({ retaddr, ksymbolicate(retaddr) });
|
recognized_symbols.append({ retaddr, ksymbolicate(retaddr) });
|
||||||
memcpy(&stack_ptr, (u32*)stack_ptr, sizeof(void*));
|
memcpy(&stack_ptr, (uintptr_t*)stack_ptr, sizeof(uintptr_t));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -795,14 +795,14 @@ String Thread::backtrace_impl() const
|
||||||
return builder.to_string();
|
return builder.to_string();
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector<u32> Thread::raw_backtrace(u32 ebp) const
|
Vector<uintptr_t> Thread::raw_backtrace(uintptr_t ebp) const
|
||||||
{
|
{
|
||||||
auto& process = const_cast<Process&>(this->process());
|
auto& process = const_cast<Process&>(this->process());
|
||||||
ProcessPagingScope paging_scope(process);
|
ProcessPagingScope paging_scope(process);
|
||||||
Vector<u32, Profiling::max_stack_frame_count> backtrace;
|
Vector<uintptr_t, Profiling::max_stack_frame_count> backtrace;
|
||||||
backtrace.append(ebp);
|
backtrace.append(ebp);
|
||||||
for (u32* stack_ptr = (u32*)ebp; process.validate_read_from_kernel(VirtualAddress((u32)stack_ptr), sizeof(void*) * 2); stack_ptr = (u32*)*stack_ptr) {
|
for (uintptr_t* stack_ptr = (uintptr_t*)ebp; process.validate_read_from_kernel(VirtualAddress((uintptr_t)stack_ptr), sizeof(uintptr_t) * 2); stack_ptr = (uintptr_t*)*stack_ptr) {
|
||||||
u32 retaddr = stack_ptr[1];
|
uintptr_t retaddr = stack_ptr[1];
|
||||||
backtrace.append(retaddr);
|
backtrace.append(retaddr);
|
||||||
if (backtrace.size() == Profiling::max_stack_frame_count)
|
if (backtrace.size() == Profiling::max_stack_frame_count)
|
||||||
break;
|
break;
|
||||||
|
@ -818,7 +818,7 @@ void Thread::make_thread_specific_region(Badge<Process>)
|
||||||
SmapDisabler disabler;
|
SmapDisabler disabler;
|
||||||
auto* thread_specific_data = (ThreadSpecificData*)region->vaddr().offset(align_up_to(process().m_master_tls_size, thread_specific_region_alignment)).as_ptr();
|
auto* thread_specific_data = (ThreadSpecificData*)region->vaddr().offset(align_up_to(process().m_master_tls_size, thread_specific_region_alignment)).as_ptr();
|
||||||
auto* thread_local_storage = (u8*)((u8*)thread_specific_data) - align_up_to(process().m_master_tls_size, process().m_master_tls_alignment);
|
auto* thread_local_storage = (u8*)((u8*)thread_specific_data) - align_up_to(process().m_master_tls_size, process().m_master_tls_alignment);
|
||||||
m_thread_specific_data = VirtualAddress((u32)thread_specific_data);
|
m_thread_specific_data = VirtualAddress((uintptr_t)thread_specific_data);
|
||||||
thread_specific_data->self = thread_specific_data;
|
thread_specific_data->self = thread_specific_data;
|
||||||
if (process().m_master_tls_size)
|
if (process().m_master_tls_size)
|
||||||
memcpy(thread_local_storage, process().m_master_tls_region->vaddr().as_ptr(), process().m_master_tls_size);
|
memcpy(thread_local_storage, process().m_master_tls_region->vaddr().as_ptr(), process().m_master_tls_size);
|
||||||
|
|
|
@ -66,17 +66,17 @@ MemoryManager::~MemoryManager()
|
||||||
void MemoryManager::protect_kernel_image()
|
void MemoryManager::protect_kernel_image()
|
||||||
{
|
{
|
||||||
// Disable writing to the kernel text and rodata segments.
|
// Disable writing to the kernel text and rodata segments.
|
||||||
extern u32 start_of_kernel_text;
|
extern uintptr_t start_of_kernel_text;
|
||||||
extern u32 start_of_kernel_data;
|
extern uintptr_t start_of_kernel_data;
|
||||||
for (size_t i = (u32)&start_of_kernel_text; i < (u32)&start_of_kernel_data; i += PAGE_SIZE) {
|
for (size_t i = (uintptr_t)&start_of_kernel_text; i < (uintptr_t)&start_of_kernel_data; i += PAGE_SIZE) {
|
||||||
auto& pte = ensure_pte(kernel_page_directory(), VirtualAddress(i));
|
auto& pte = ensure_pte(kernel_page_directory(), VirtualAddress(i));
|
||||||
pte.set_writable(false);
|
pte.set_writable(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (g_cpu_supports_nx) {
|
if (g_cpu_supports_nx) {
|
||||||
// Disable execution of the kernel data and bss segments.
|
// Disable execution of the kernel data and bss segments.
|
||||||
extern u32 end_of_kernel_bss;
|
extern uintptr_t end_of_kernel_bss;
|
||||||
for (size_t i = (u32)&start_of_kernel_data; i < (u32)&end_of_kernel_bss; i += PAGE_SIZE) {
|
for (size_t i = (uintptr_t)&start_of_kernel_data; i < (uintptr_t)&end_of_kernel_bss; i += PAGE_SIZE) {
|
||||||
auto& pte = ensure_pte(kernel_page_directory(), VirtualAddress(i));
|
auto& pte = ensure_pte(kernel_page_directory(), VirtualAddress(i));
|
||||||
pte.set_execute_disabled(true);
|
pte.set_execute_disabled(true);
|
||||||
}
|
}
|
||||||
|
@ -101,7 +101,7 @@ void MemoryManager::setup_low_1mb()
|
||||||
if (g_cpu_supports_nx)
|
if (g_cpu_supports_nx)
|
||||||
pde_zero.set_execute_disabled(true);
|
pde_zero.set_execute_disabled(true);
|
||||||
|
|
||||||
for (u32 offset = 0; offset < (2 * MB); offset += PAGE_SIZE) {
|
for (uintptr_t offset = 0; offset < (2 * MB); offset += PAGE_SIZE) {
|
||||||
auto& page_table_page = m_low_page_table;
|
auto& page_table_page = m_low_page_table;
|
||||||
auto& pte = quickmap_pt(page_table_page->paddr())[offset / PAGE_SIZE];
|
auto& pte = quickmap_pt(page_table_page->paddr())[offset / PAGE_SIZE];
|
||||||
pte.set_physical_page_base(offset);
|
pte.set_physical_page_base(offset);
|
||||||
|
@ -119,11 +119,11 @@ void MemoryManager::parse_memory_map()
|
||||||
auto* mmap = (multiboot_memory_map_t*)(low_physical_to_virtual(multiboot_info_ptr->mmap_addr));
|
auto* mmap = (multiboot_memory_map_t*)(low_physical_to_virtual(multiboot_info_ptr->mmap_addr));
|
||||||
for (; (unsigned long)mmap < (low_physical_to_virtual(multiboot_info_ptr->mmap_addr)) + (multiboot_info_ptr->mmap_length); mmap = (multiboot_memory_map_t*)((unsigned long)mmap + mmap->size + sizeof(mmap->size))) {
|
for (; (unsigned long)mmap < (low_physical_to_virtual(multiboot_info_ptr->mmap_addr)) + (multiboot_info_ptr->mmap_length); mmap = (multiboot_memory_map_t*)((unsigned long)mmap + mmap->size + sizeof(mmap->size))) {
|
||||||
kprintf("MM: Multiboot mmap: base_addr = 0x%x%08x, length = 0x%x%08x, type = 0x%x\n",
|
kprintf("MM: Multiboot mmap: base_addr = 0x%x%08x, length = 0x%x%08x, type = 0x%x\n",
|
||||||
(u32)(mmap->addr >> 32),
|
(uintptr_t)(mmap->addr >> 32),
|
||||||
(u32)(mmap->addr & 0xffffffff),
|
(uintptr_t)(mmap->addr & 0xffffffff),
|
||||||
(u32)(mmap->len >> 32),
|
(uintptr_t)(mmap->len >> 32),
|
||||||
(u32)(mmap->len & 0xffffffff),
|
(uintptr_t)(mmap->len & 0xffffffff),
|
||||||
(u32)mmap->type);
|
(uintptr_t)mmap->type);
|
||||||
|
|
||||||
if (mmap->type != MULTIBOOT_MEMORY_AVAILABLE)
|
if (mmap->type != MULTIBOOT_MEMORY_AVAILABLE)
|
||||||
continue;
|
continue;
|
||||||
|
@ -135,7 +135,7 @@ void MemoryManager::parse_memory_map()
|
||||||
if ((mmap->addr + mmap->len) > 0xffffffff)
|
if ((mmap->addr + mmap->len) > 0xffffffff)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
auto diff = (u32)mmap->addr % PAGE_SIZE;
|
auto diff = (uintptr_t)mmap->addr % PAGE_SIZE;
|
||||||
if (diff != 0) {
|
if (diff != 0) {
|
||||||
kprintf("MM: got an unaligned region base from the bootloader; correcting %p by %d bytes\n", mmap->addr, diff);
|
kprintf("MM: got an unaligned region base from the bootloader; correcting %p by %d bytes\n", mmap->addr, diff);
|
||||||
diff = PAGE_SIZE - diff;
|
diff = PAGE_SIZE - diff;
|
||||||
|
@ -153,7 +153,7 @@ void MemoryManager::parse_memory_map()
|
||||||
|
|
||||||
#ifdef MM_DEBUG
|
#ifdef MM_DEBUG
|
||||||
kprintf("MM: considering memory at %p - %p\n",
|
kprintf("MM: considering memory at %p - %p\n",
|
||||||
(u32)mmap->addr, (u32)(mmap->addr + mmap->len));
|
(uintptr_t)mmap->addr, (uintptr_t)(mmap->addr + mmap->len));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
for (size_t page_base = mmap->addr; page_base < (mmap->addr + mmap->len); page_base += PAGE_SIZE) {
|
for (size_t page_base = mmap->addr; page_base < (mmap->addr + mmap->len); page_base += PAGE_SIZE) {
|
||||||
|
@ -219,7 +219,7 @@ PageTableEntry& MemoryManager::ensure_pte(PageDirectory& page_directory, Virtual
|
||||||
page_directory.m_physical_pages.set(page_directory_index, move(page_table));
|
page_directory.m_physical_pages.set(page_directory_index, move(page_table));
|
||||||
}
|
}
|
||||||
|
|
||||||
return quickmap_pt(PhysicalAddress((u32)pde.page_table_base()))[page_table_index];
|
return quickmap_pt(PhysicalAddress((uintptr_t)pde.page_table_base()))[page_table_index];
|
||||||
}
|
}
|
||||||
|
|
||||||
void MemoryManager::initialize()
|
void MemoryManager::initialize()
|
||||||
|
@ -410,7 +410,7 @@ RefPtr<PhysicalPage> MemoryManager::allocate_user_physical_page(ShouldZeroFill s
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (should_zero_fill == ShouldZeroFill::Yes) {
|
if (should_zero_fill == ShouldZeroFill::Yes) {
|
||||||
auto* ptr = (u32*)quickmap_page(*page);
|
auto* ptr = quickmap_page(*page);
|
||||||
memset(ptr, 0, PAGE_SIZE);
|
memset(ptr, 0, PAGE_SIZE);
|
||||||
unquickmap_page();
|
unquickmap_page();
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,9 +30,9 @@
|
||||||
#include <Kernel/VM/MemoryManager.h>
|
#include <Kernel/VM/MemoryManager.h>
|
||||||
#include <Kernel/VM/PageDirectory.h>
|
#include <Kernel/VM/PageDirectory.h>
|
||||||
|
|
||||||
static const u32 userspace_range_base = 0x00800000;
|
static const uintptr_t userspace_range_base = 0x00800000;
|
||||||
static const u32 userspace_range_ceiling = 0xbe000000;
|
static const uintptr_t userspace_range_ceiling = 0xbe000000;
|
||||||
static const u32 kernelspace_range_base = 0xc0800000;
|
static const uintptr_t kernelspace_range_base = 0xc0800000;
|
||||||
|
|
||||||
static HashMap<u32, PageDirectory*>& cr3_map()
|
static HashMap<u32, PageDirectory*>& cr3_map()
|
||||||
{
|
{
|
||||||
|
@ -58,9 +58,9 @@ PageDirectory::PageDirectory()
|
||||||
m_range_allocator.initialize_with_range(VirtualAddress(0xc0800000), 0x3f000000);
|
m_range_allocator.initialize_with_range(VirtualAddress(0xc0800000), 0x3f000000);
|
||||||
|
|
||||||
// Adopt the page tables already set up by boot.S
|
// Adopt the page tables already set up by boot.S
|
||||||
PhysicalAddress boot_pdpt_paddr(virtual_to_low_physical((u32)boot_pdpt));
|
PhysicalAddress boot_pdpt_paddr(virtual_to_low_physical((uintptr_t)boot_pdpt));
|
||||||
PhysicalAddress boot_pd0_paddr(virtual_to_low_physical((u32)boot_pd0));
|
PhysicalAddress boot_pd0_paddr(virtual_to_low_physical((uintptr_t)boot_pd0));
|
||||||
PhysicalAddress boot_pd3_paddr(virtual_to_low_physical((u32)boot_pd3));
|
PhysicalAddress boot_pd3_paddr(virtual_to_low_physical((uintptr_t)boot_pd3));
|
||||||
kprintf("MM: boot_pdpt @ P%p\n", boot_pdpt_paddr.get());
|
kprintf("MM: boot_pdpt @ P%p\n", boot_pdpt_paddr.get());
|
||||||
kprintf("MM: boot_pd0 @ P%p\n", boot_pd0_paddr.get());
|
kprintf("MM: boot_pd0 @ P%p\n", boot_pd0_paddr.get());
|
||||||
kprintf("MM: boot_pd3 @ P%p\n", boot_pd3_paddr.get());
|
kprintf("MM: boot_pd3 @ P%p\n", boot_pd3_paddr.get());
|
||||||
|
|
|
@ -32,22 +32,22 @@
|
||||||
class PhysicalAddress {
|
class PhysicalAddress {
|
||||||
public:
|
public:
|
||||||
PhysicalAddress() {}
|
PhysicalAddress() {}
|
||||||
explicit PhysicalAddress(u32 address)
|
explicit PhysicalAddress(uintptr_t address)
|
||||||
: m_address(address)
|
: m_address(address)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
PhysicalAddress offset(u32 o) const { return PhysicalAddress(m_address + o); }
|
PhysicalAddress offset(uintptr_t o) const { return PhysicalAddress(m_address + o); }
|
||||||
u32 get() const { return m_address; }
|
uintptr_t get() const { return m_address; }
|
||||||
void set(u32 address) { m_address = address; }
|
void set(uintptr_t address) { m_address = address; }
|
||||||
void mask(u32 m) { m_address &= m; }
|
void mask(uintptr_t m) { m_address &= m; }
|
||||||
|
|
||||||
bool is_null() const { return m_address == 0; }
|
bool is_null() const { return m_address == 0; }
|
||||||
|
|
||||||
u8* as_ptr() { return reinterpret_cast<u8*>(m_address); }
|
u8* as_ptr() { return reinterpret_cast<u8*>(m_address); }
|
||||||
const u8* as_ptr() const { return reinterpret_cast<const u8*>(m_address); }
|
const u8* as_ptr() const { return reinterpret_cast<const u8*>(m_address); }
|
||||||
|
|
||||||
u32 page_base() const { return m_address & 0xfffff000; }
|
uintptr_t page_base() const { return m_address & 0xfffff000; }
|
||||||
|
|
||||||
bool operator==(const PhysicalAddress& other) const { return m_address == other.m_address; }
|
bool operator==(const PhysicalAddress& other) const { return m_address == other.m_address; }
|
||||||
bool operator!=(const PhysicalAddress& other) const { return m_address != other.m_address; }
|
bool operator!=(const PhysicalAddress& other) const { return m_address != other.m_address; }
|
||||||
|
@ -57,7 +57,7 @@ public:
|
||||||
bool operator<=(const PhysicalAddress& other) const { return m_address <= other.m_address; }
|
bool operator<=(const PhysicalAddress& other) const { return m_address <= other.m_address; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
u32 m_address { 0 };
|
uintptr_t m_address { 0 };
|
||||||
};
|
};
|
||||||
|
|
||||||
inline const LogStream& operator<<(const LogStream& stream, PhysicalAddress value)
|
inline const LogStream& operator<<(const LogStream& stream, PhysicalAddress value)
|
||||||
|
|
|
@ -101,11 +101,11 @@ void PhysicalRegion::return_page_at(PhysicalAddress addr)
|
||||||
ASSERT_NOT_REACHED();
|
ASSERT_NOT_REACHED();
|
||||||
}
|
}
|
||||||
|
|
||||||
int local_offset = addr.get() - m_lower.get();
|
ptrdiff_t local_offset = addr.get() - m_lower.get();
|
||||||
ASSERT(local_offset >= 0);
|
ASSERT(local_offset >= 0);
|
||||||
ASSERT((u32)local_offset < (u32)(m_pages * PAGE_SIZE));
|
ASSERT((uintptr_t)local_offset < (uintptr_t)(m_pages * PAGE_SIZE));
|
||||||
|
|
||||||
auto page = (unsigned)local_offset / PAGE_SIZE;
|
auto page = (uintptr_t)local_offset / PAGE_SIZE;
|
||||||
if (page < m_last)
|
if (page < m_last)
|
||||||
m_last = page;
|
m_last = page;
|
||||||
|
|
||||||
|
|
|
@ -32,23 +32,23 @@
|
||||||
class VirtualAddress {
|
class VirtualAddress {
|
||||||
public:
|
public:
|
||||||
VirtualAddress() {}
|
VirtualAddress() {}
|
||||||
explicit VirtualAddress(u32 address)
|
explicit VirtualAddress(uintptr_t address)
|
||||||
: m_address(address)
|
: m_address(address)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
explicit VirtualAddress(const void* address)
|
explicit VirtualAddress(const void* address)
|
||||||
: m_address((u32)address)
|
: m_address((uintptr_t)address)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
bool is_null() const { return m_address == 0; }
|
bool is_null() const { return m_address == 0; }
|
||||||
bool is_page_aligned() const { return (m_address & 0xfff) == 0; }
|
bool is_page_aligned() const { return (m_address & 0xfff) == 0; }
|
||||||
|
|
||||||
VirtualAddress offset(u32 o) const { return VirtualAddress(m_address + o); }
|
VirtualAddress offset(uintptr_t o) const { return VirtualAddress(m_address + o); }
|
||||||
u32 get() const { return m_address; }
|
uintptr_t get() const { return m_address; }
|
||||||
void set(u32 address) { m_address = address; }
|
void set(uintptr_t address) { m_address = address; }
|
||||||
void mask(u32 m) { m_address &= m; }
|
void mask(uintptr_t m) { m_address &= m; }
|
||||||
|
|
||||||
bool operator<=(const VirtualAddress& other) const { return m_address <= other.m_address; }
|
bool operator<=(const VirtualAddress& other) const { return m_address <= other.m_address; }
|
||||||
bool operator>=(const VirtualAddress& other) const { return m_address >= other.m_address; }
|
bool operator>=(const VirtualAddress& other) const { return m_address >= other.m_address; }
|
||||||
|
@ -63,7 +63,7 @@ public:
|
||||||
VirtualAddress page_base() const { return VirtualAddress(m_address & 0xfffff000); }
|
VirtualAddress page_base() const { return VirtualAddress(m_address & 0xfffff000); }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
u32 m_address { 0 };
|
uintptr_t m_address { 0 };
|
||||||
};
|
};
|
||||||
|
|
||||||
inline VirtualAddress operator-(const VirtualAddress& a, const VirtualAddress& b)
|
inline VirtualAddress operator-(const VirtualAddress& a, const VirtualAddress& b)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue