[gem5-dev] Change in public/gem5[master]: arch-arm: Add support for secure state in semihosting
Andreas Sandberg merged this change by Andreas Sandberg. ( https://gem5-review.googlesource.com/8365 ) Change subject: arch-arm: Add support for secure state in semihosting .. arch-arm: Add support for secure state in semihosting The semihosting component currently issues non-secure memory accesses using the standard port proxy. This doesn't work when the guest is running in secure state. Change-Id: Id34b142cfcd9d77b455c040ae7f7397c29aebbc6 Signed-off-by: Andreas Sandberg Reviewed-by: Jack Travaglini Reviewed-on: https://gem5-review.googlesource.com/8365 Reviewed-by: Giacomo Travaglini --- M src/arch/arm/semihosting.cc M src/arch/arm/semihosting.hh 2 files changed, 32 insertions(+), 11 deletions(-) Approvals: Giacomo Travaglini: Looks good to me, approved Andreas Sandberg: Looks good to me, approved diff --git a/src/arch/arm/semihosting.cc b/src/arch/arm/semihosting.cc index 98b50f4..89e1b2e 100644 --- a/src/arch/arm/semihosting.cc +++ b/src/arch/arm/semihosting.cc @@ -157,7 +157,7 @@ } std::vector argv(call->argc64 + 1); -PortProxy &proxy = tc->getPhysProxy(); +PortProxy &proxy = physProxy(tc); ByteOrder endian = ArmISA::byteOrder(tc); DPRINTF(Semihosting, "Semihosting call64: %s(0x%x)\n", call->name, param); @@ -192,7 +192,7 @@ } std::vector argv(call->argc32 + 1); -PortProxy &proxy = tc->getPhysProxy(); +PortProxy &proxy = physProxy(tc); ByteOrder endian = ArmISA::byteOrder(tc); DPRINTF(Semihosting, "Semihosting call32: %s(0x%x)\n", call->name, param); @@ -236,13 +236,30 @@ files[i] = FileBase::create(*this, cp, csprintf("file%i", i)); } +PortProxy & +ArmSemihosting::physProxy(ThreadContext *tc) +{ +if (ArmISA::inSecureState(tc)) { +if (!physProxyS) { +System *sys = tc->getSystemPtr(); +physProxyS.reset(new SecurePortProxy( + sys->getSystemPort(), + sys->cacheLineSize())); +} +return *physProxyS; +} else { +return tc->getPhysProxy(); +} +} + + std::string ArmSemihosting::readString(ThreadContext *tc, Addr ptr, size_t len) { std::vector buf(len + 1); buf[len] = '\0'; -tc->getPhysProxy().readBlob(ptr, (uint8_t *)buf.data(), len); +physProxy(tc).readBlob(ptr, (uint8_t *)buf.data(), len); return std::string(buf.data()); } @@ -302,7 +319,7 @@ ArmSemihosting::callWriteC(ThreadContext *tc, bool aarch64, std::vector &argv) { -const char c = tc->getPhysProxy().read(argv[0]); +const char c = physProxy(tc).read(argv[0]); DPRINTF(Semihosting, "Semihosting SYS_WRITEC('%c')\n", c); std::cout.put(c); @@ -315,7 +332,7 @@ std::vector &argv) { DPRINTF(Semihosting, "Semihosting SYS_WRITE0(...)\n"); -PortProxy &proxy = tc->getPhysProxy(); +PortProxy &proxy = physProxy(tc); for (Addr addr = (Addr)argv[0]; ; ++addr) { char data = proxy.read(addr); if (data == 0) @@ -335,7 +352,7 @@ return RetErrno(argv[3], EBADF); std::vector buffer(argv[3]); -tc->getPhysProxy().readBlob(argv[2], buffer.data(), buffer.size()); +physProxy(tc).readBlob(argv[2], buffer.data(), buffer.size()); int64_t ret = files[argv[1]]->write(buffer.data(), buffer.size()); if (ret < 0) { @@ -362,7 +379,7 @@ } else { panic_if(ret > buffer.size(), "Read longer than buffer size."); -tc->getPhysProxy().writeBlob(argv[2], buffer.data(), ret); +physProxy(tc).writeBlob(argv[2], buffer.data(), ret); // Return the number of bytes not written return retOK(argv[3] - ret); @@ -449,7 +466,7 @@ if (path_len >= max_len) return retError(ENOSPC); -tc->getPhysProxy().writeBlob( +physProxy(tc).writeBlob( guest_buf, (const uint8_t *)path, path_len + 1); return retOK(0); } @@ -519,7 +536,7 @@ std::vector &argv) { if (cmdLine.size() + 1 < argv[2]) { -PortProxy &proxy = tc->getPhysProxy(); +PortProxy &proxy = physProxy(tc); ByteOrder endian = ArmISA::byteOrder(tc); proxy.writeBlob( (Addr)argv[1], @@ -576,7 +593,7 @@ heap_base, heap_limit, stack_base, stack_limit); Addr base = argv[1]; -PortProxy &proxy = tc->getPhysProxy(); +PortProxy &proxy = physProxy(tc); ByteOrder endian = ArmISA::byteOrder(tc); if (aarch64) { proxy.writeHtoG(base + 0 * 8, heap_base, endian); @@ -631,7 +648,7 @@ ArmSemihosting::callElapsed(ThreadContext *tc, bool aarch64, std::vector &argv) { -PortProxy &proxy = tc->getPhysProxy(); +PortProxy &proxy = physProxy(tc); ByteOrder endian = ArmISA::byteOrder(tc); const uint64_t tick = semiTick(curTick()); diff --git a/src/arch/arm/semihostin
[gem5-dev] Change in public/gem5[master]: arch-arm: Add support for secure state in semihosting
Hello Giacomo Travaglini, I'd like you to do a code review. Please visit https://gem5-review.googlesource.com/8365 to review the following change. Change subject: arch-arm: Add support for secure state in semihosting .. arch-arm: Add support for secure state in semihosting The semihosting component currently issues non-secure memory accesses using the standard port proxy. This doesn't work when the guest is running in secure state. Change-Id: Id34b142cfcd9d77b455c040ae7f7397c29aebbc6 Signed-off-by: Andreas Sandberg Reviewed-by: Jack Travaglini --- M src/arch/arm/semihosting.cc M src/arch/arm/semihosting.hh 2 files changed, 32 insertions(+), 11 deletions(-) diff --git a/src/arch/arm/semihosting.cc b/src/arch/arm/semihosting.cc index e8e0fa1..267eeb0 100644 --- a/src/arch/arm/semihosting.cc +++ b/src/arch/arm/semihosting.cc @@ -157,7 +157,7 @@ } std::vector argv(call->argc64 + 1); -PortProxy &proxy = tc->getPhysProxy(); +PortProxy &proxy = physProxy(tc); ByteOrder endian = ArmISA::byteOrder(tc); DPRINTF(Semihosting, "Semihosting call64: %s(0x%x)\n", call->name, param); @@ -190,7 +190,7 @@ } std::vector argv(call->argc32 + 1); -PortProxy &proxy = tc->getPhysProxy(); +PortProxy &proxy = physProxy(tc); ByteOrder endian = ArmISA::byteOrder(tc); DPRINTF(Semihosting, "Semihosting call32: %s(0x%x)\n", call->name, param); @@ -232,13 +232,30 @@ files[i] = FileBase::create(*this, cp, csprintf("file%i", i)); } +PortProxy & +ArmSemihosting::physProxy(ThreadContext *tc) +{ +if (ArmISA::inSecureState(tc)) { +if (!physProxyS) { +System *sys = tc->getSystemPtr(); +physProxyS.reset(new SecurePortProxy( + sys->getSystemPort(), + sys->cacheLineSize())); +} +return *physProxyS; +} else { +return tc->getPhysProxy(); +} +} + + std::string ArmSemihosting::readString(ThreadContext *tc, Addr ptr, size_t len) { std::vector buf(len + 1); buf[len] = '\0'; -tc->getPhysProxy().readBlob(ptr, (uint8_t *)buf.data(), len); +physProxy(tc).readBlob(ptr, (uint8_t *)buf.data(), len); return std::string(buf.data()); } @@ -298,7 +315,7 @@ ArmSemihosting::callWriteC(ThreadContext *tc, bool aarch64, std::vector &argv) { -const char c = tc->getPhysProxy().read(argv[0]); +const char c = physProxy(tc).read(argv[0]); DPRINTF(Semihosting, "Semihosting SYS_WRITEC('%c')\n", c); std::cout.put(c); @@ -311,7 +328,7 @@ std::vector &argv) { DPRINTF(Semihosting, "Semihosting SYS_WRITE0(...)\n"); -PortProxy &proxy = tc->getPhysProxy(); +PortProxy &proxy = physProxy(tc); for (Addr addr = (Addr)argv[0]; ; ++addr) { char data = proxy.read(addr); if (data == 0) @@ -331,7 +348,7 @@ return RetErrno(argv[3], EBADF); std::vector buffer(argv[3]); -tc->getPhysProxy().readBlob(argv[2], buffer.data(), buffer.size()); +physProxy(tc).readBlob(argv[2], buffer.data(), buffer.size()); int64_t ret = files[argv[1]]->write(buffer.data(), buffer.size()); if (ret < 0) { @@ -358,7 +375,7 @@ } else { panic_if(ret > buffer.size(), "Read longer than buffer size."); -tc->getPhysProxy().writeBlob(argv[2], buffer.data(), ret); +physProxy(tc).writeBlob(argv[2], buffer.data(), ret); // Return the number of bytes not written return retOK(argv[3] - ret); @@ -445,7 +462,7 @@ if (path_len >= max_len) return retError(ENOSPC); -tc->getPhysProxy().writeBlob( +physProxy(tc).writeBlob( guest_buf, (const uint8_t *)path, path_len + 1); return retOK(0); } @@ -515,7 +532,7 @@ std::vector &argv) { if (cmdLine.size() + 1 < argv[2]) { -PortProxy &proxy = tc->getPhysProxy(); +PortProxy &proxy = physProxy(tc); ByteOrder endian = ArmISA::byteOrder(tc); proxy.writeBlob( (Addr)argv[1], @@ -572,7 +589,7 @@ heap_base, heap_limit, stack_base, stack_limit); Addr base = argv[1]; -PortProxy &proxy = tc->getPhysProxy(); +PortProxy &proxy = physProxy(tc); ByteOrder endian = ArmISA::byteOrder(tc); if (aarch64) { proxy.writeHtoG(base + 0 * 8, heap_base, endian); @@ -627,7 +644,7 @@ ArmSemihosting::callElapsed(ThreadContext *tc, bool aarch64, std::vector &argv) { -PortProxy &proxy = tc->getPhysProxy(); +PortProxy &proxy = physProxy(tc); ByteOrder endian = ArmISA::byteOrder(tc); const uint64_t tick = semiTick(curTick()); diff --git a/src/arch/arm/semihosting.hh b/src/arch/arm/semihosting.hh index a4aa845..14c5f9d 100644 --- a/src/arch/arm/semihosting.hh +++ b/src/arch/arm/semihosting.hh @@ -48,6 +48,