FirmIO: Use uintptr_t for 64-bit compatibility

add-device-sharing
Paul Hollinsky 2022-04-04 20:44:11 -04:00
parent 2e3b738e76
commit 91abf378f8
2 changed files with 12 additions and 10 deletions

View File

@ -48,6 +48,7 @@ private:
}; };
struct Msg { struct Msg {
using Ref = uintptr_t;
enum class Command : uint32_t { enum class Command : uint32_t {
ComData = 0xAA000000, ComData = 0xAA000000,
ComFree = 0xAA000001, ComFree = 0xAA000001,
@ -56,15 +57,15 @@ private:
struct Data { struct Data {
uint32_t addr; uint32_t addr;
uint32_t len; uint32_t len;
uint32_t ref; Ref ref;
uint32_t addr1; uint32_t addr1;
uint32_t len1; uint32_t len1;
uint32_t ref1; Ref ref1;
uint32_t reserved; uint32_t reserved;
}; };
struct Free { struct Free {
uint32_t refCount; uint32_t refCount;
uint32_t ref[6]; Ref ref[6];
}; };
union Payload { union Payload {
Data data; Data data;
@ -97,12 +98,13 @@ private:
class Mempool { class Mempool {
public: public:
using PhysicalAddress = uintptr_t;
static constexpr const size_t BlockSize = 4096; static constexpr const size_t BlockSize = 4096;
Mempool(uint8_t* start, uint32_t size, uint8_t* virt, uint32_t phys); Mempool(uint8_t* start, uint32_t size, uint8_t* virt, PhysicalAddress phys);
uint8_t* alloc(uint32_t size); uint8_t* alloc(uint32_t size);
bool free(uint8_t* addr); bool free(uint8_t* addr);
uint32_t translate(uint8_t* addr) const; PhysicalAddress translate(uint8_t* addr) const;
private: private:
struct BlockInfo { struct BlockInfo {
@ -118,7 +120,7 @@ private:
std::atomic<uint32_t> usedBlocks; std::atomic<uint32_t> usedBlocks;
uint8_t* const virtualAddress; uint8_t* const virtualAddress;
const uint32_t physicalAddress; const PhysicalAddress physicalAddress;
}; };
int fd = -1; int fd = -1;

View File

@ -286,7 +286,7 @@ bool FirmIO::writeInternal(const std::vector<uint8_t>& bytes) {
Msg msg = { Msg::Command::ComData }; Msg msg = { Msg::Command::ComData };
msg.payload.data.addr = outMemory->translate(sharedData); msg.payload.data.addr = outMemory->translate(sharedData);
msg.payload.data.len = static_cast<uint32_t>(bytes.size()); msg.payload.data.len = static_cast<uint32_t>(bytes.size());
msg.payload.data.ref = reinterpret_cast<uint32_t>(sharedData); msg.payload.data.ref = reinterpret_cast<Msg::Ref>(sharedData);
if(!out->write(&msg)) if(!out->write(&msg))
return false; return false;
@ -325,7 +325,7 @@ bool FirmIO::MsgQueue::isFull() const {
return ((info->head + 1) & (info->size - 1)) == info->tail; return ((info->head + 1) & (info->size - 1)) == info->tail;
} }
FirmIO::Mempool::Mempool(uint8_t* start, uint32_t size, uint8_t* virt, uint32_t phys) FirmIO::Mempool::Mempool(uint8_t* start, uint32_t size, uint8_t* virt, PhysicalAddress phys)
: blocks(size / BlockSize), usedBlocks(0), : blocks(size / BlockSize), usedBlocks(0),
virtualAddress(virt), physicalAddress(phys) { virtualAddress(virt), physicalAddress(phys) {
size_t idx = 0; size_t idx = 0;
@ -370,6 +370,6 @@ bool FirmIO::Mempool::free(uint8_t* addr) {
return true; return true;
} }
uint32_t FirmIO::Mempool::translate(uint8_t* addr) const { FirmIO::Mempool::PhysicalAddress FirmIO::Mempool::translate(uint8_t* addr) const {
return reinterpret_cast<uint32_t>(addr - virtualAddress + physicalAddress); return reinterpret_cast<PhysicalAddress>(addr - virtualAddress + physicalAddress);
} }