Improve span::as_string and other minor fixes

This commit is contained in:
◱ PixelyIon 2020-10-02 16:37:13 +05:30 committed by ◱ PixelyIon
parent 97ac45d83b
commit 7ad86ec46f
8 changed files with 21 additions and 18 deletions

View File

@ -223,8 +223,11 @@ namespace skyline {
throw exception("Span size is less than Out type size (0x{:X}/0x{:X})", span::size_bytes(), sizeof(Out)); throw exception("Span size is less than Out type size (0x{:X}/0x{:X})", span::size_bytes(), sizeof(Out));
} }
constexpr std::string_view as_string(indexType length = 0) { /**
return std::string_view(reinterpret_cast<char *>(span::data()), length ? length : span::size_bytes()); * @param nullTerminated If true and the string is null-terminated, a view of it will be returned (not including the null terminator itself), otherwise the entire span will be returned as a string view
*/
constexpr std::string_view as_string(bool nullTerminated = false) {
return std::string_view(reinterpret_cast<char *>(span::data()), nullTerminated ? (std::find(span::begin(), span::end(), 0) - span::begin()) : span::size_bytes());
} }
template<typename Out, size_t OutExtent = std::dynamic_extent> template<typename Out, size_t OutExtent = std::dynamic_extent>

View File

@ -21,9 +21,8 @@ namespace skyline::crypto {
std::vector<char>::iterator lineEnd; std::vector<char>::iterator lineEnd;
while ((lineEnd = std::find(lineStart, fileContent.end(), '\n')) != fileContent.end()) { while ((lineEnd = std::find(lineStart, fileContent.end(), '\n')) != fileContent.end()) {
auto keyEnd{std::find(lineStart, lineEnd, '=')}; auto keyEnd{std::find(lineStart, lineEnd, '=')};
if (keyEnd == lineEnd) { if (keyEnd == lineEnd)
throw exception("Invalid key file"); throw exception("Invalid key file");
}
std::string_view key(&*lineStart, keyEnd - lineStart); std::string_view key(&*lineStart, keyEnd - lineStart);
std::string_view value(&*(keyEnd + 1), lineEnd - keyEnd - 1); std::string_view value(&*(keyEnd + 1), lineEnd - keyEnd - 1);

View File

@ -7,7 +7,7 @@
namespace skyline { namespace skyline {
namespace constant { namespace constant {
constexpr size_t MaxHwSyncpointCount{192}; //!< The maximum number of HOST1X syncpoints on t210 constexpr size_t MaxHwSyncpointCount{192}; //!< The maximum number of host1x syncpoints on T210
} }
namespace gpu { namespace gpu {

View File

@ -325,7 +325,7 @@ namespace skyline::kernel::svc {
return; return;
} }
memory::Permission permission{*reinterpret_cast<memory::Permission *>(&state.ctx->registers.w3)}; auto permission{*reinterpret_cast<memory::Permission *>(&state.ctx->registers.w3)};
if ((permission.w && !permission.r) || (permission.x && !permission.r)) { if ((permission.w && !permission.r) || (permission.x && !permission.r)) {
state.logger->Warn("svcMapSharedMemory: 'permission' invalid: {}{}{}", permission.r ? "R" : "-", permission.w ? "W" : "-", permission.x ? "X" : "-"); state.logger->Warn("svcMapSharedMemory: 'permission' invalid: {}{}{}", permission.r ? "R" : "-", permission.w ? "W" : "-", permission.x ? "X" : "-");
state.ctx->registers.w0 = result::InvalidNewMemoryPermission; state.ctx->registers.w0 = result::InvalidNewMemoryPermission;
@ -358,7 +358,7 @@ namespace skyline::kernel::svc {
return; return;
} }
memory::Permission permission{*reinterpret_cast<memory::Permission *>(&state.ctx->registers.w3)}; auto permission{*reinterpret_cast<memory::Permission *>(&state.ctx->registers.w3)};
if ((permission.w && !permission.r) || (permission.x && !permission.r)) { if ((permission.w && !permission.r) || (permission.x && !permission.r)) {
state.logger->Warn("svcCreateTransferMemory: 'permission' invalid: {}{}{}", permission.r ? "R" : "-", permission.w ? "W" : "-", permission.x ? "X" : "-"); state.logger->Warn("svcCreateTransferMemory: 'permission' invalid: {}{}{}", permission.r ? "R" : "-", permission.w ? "W" : "-", permission.x ? "X" : "-");
state.ctx->registers.w0 = result::InvalidNewMemoryPermission; state.ctx->registers.w0 = result::InvalidNewMemoryPermission;
@ -584,7 +584,8 @@ namespace skyline::kernel::svc {
} }
void ConnectToNamedPort(DeviceState &state) { void ConnectToNamedPort(DeviceState &state) {
std::string_view port(state.process->GetPointer<char>(state.ctx->registers.x1), sizeof(service::ServiceName)); constexpr u8 portSize = 0x8; //!< The size of a port name string
std::string_view port(span(state.process->GetPointer<char>(state.ctx->registers.x1), portSize).as_string(true));
KHandle handle{}; KHandle handle{};
if (port.compare("sm:") >= 0) { if (port.compare("sm:") >= 0) {

View File

@ -59,7 +59,7 @@ namespace skyline::kernel::type {
nSize = nSize ? nSize : size; nSize = nSize ? nSize : size;
ChunkDescriptor chunk{host ? hostChunk : *state.os->memory.GetChunk(address)}; auto chunk{host ? hostChunk : *state.os->memory.GetChunk(address)};
chunk.address = nAddress; chunk.address = nAddress;
chunk.size = nSize; chunk.size = nSize;
MemoryManager::ResizeChunk(&chunk, nSize); MemoryManager::ResizeChunk(&chunk, nSize);

View File

@ -13,10 +13,10 @@ namespace skyline::service {
constexpr u8 tokenLength{0x50}; // The length of the token on BufferQueue parcels constexpr u8 tokenLength{0x50}; // The length of the token on BufferQueue parcels
data.resize(header.dataSize - (hasToken ? tokenLength : 0)); data.resize(header.dataSize - (hasToken ? tokenLength : 0));
memcpy(data.data(), buffer.data() + header.dataOffset + (hasToken ? tokenLength : 0), header.dataSize - (hasToken ? tokenLength : 0)); std::memcpy(data.data(), buffer.data() + header.dataOffset + (hasToken ? tokenLength : 0), header.dataSize - (hasToken ? tokenLength : 0));
objects.resize(header.objectsSize); objects.resize(header.objectsSize);
memcpy(objects.data(), buffer.data() + header.objectsOffset, header.objectsSize); std::memcpy(objects.data(), buffer.data() + header.objectsOffset, header.objectsSize);
} }
Parcel::Parcel(const DeviceState &state) : state(state) {} Parcel::Parcel(const DeviceState &state) : state(state) {}
@ -34,8 +34,8 @@ namespace skyline::service {
throw exception("The size of the parcel exceeds maxSize"); throw exception("The size of the parcel exceeds maxSize");
buffer.as<ParcelHeader>() = header; buffer.as<ParcelHeader>() = header;
memcpy(buffer.data() + header.dataOffset, data.data(), data.size()); std::memcpy(buffer.data() + header.dataOffset, data.data(), data.size());
memcpy(buffer.data() + header.objectsOffset, objects.data(), objects.size()); std::memcpy(buffer.data() + header.objectsOffset, objects.data(), objects.size());
return totalSize; return totalSize;
} }

View File

@ -16,6 +16,7 @@ namespace skyline::vfs {
} }
size_t CtrEncryptedBacking::Read(span<u8> output, size_t offset) { size_t CtrEncryptedBacking::Read(span<u8> output, size_t offset) {
size_t size{output.size()};
if (size == 0) if (size == 0)
return 0; return 0;

View File

@ -32,7 +32,8 @@ object KeyReader {
return false return false
val fileName = DocumentFile.fromSingleUri(context, uri)!!.name val fileName = DocumentFile.fromSingleUri(context, uri)!!.name
if ("keys" != fileName?.substringAfterLast('.')) return false if (fileName?.substringAfterLast('.')?.startsWith("keys")?.not() ?: false)
return false
val tmpOutputFile = File("${context.filesDir.canonicalFile}/${keyType.fileName}.tmp") val tmpOutputFile = File("${context.filesDir.canonicalFile}/${keyType.fileName}.tmp")
@ -76,11 +77,9 @@ object KeyReader {
} }
private fun isHexString(str : String) : Boolean { private fun isHexString(str : String) : Boolean {
for (c in str) { for (c in str)
if (!(c in '0'..'9' || c in 'a'..'f' || c in 'A'..'F')) { if (!(c in '0'..'9' || c in 'a'..'f' || c in 'A'..'F'))
return false return false
}
}
return true return true
} }
} }