From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:56127) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YgBS9-0000NW-JS for qemu-devel@nongnu.org; Thu, 09 Apr 2015 08:21:02 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1YgBS7-0003zZ-Q0 for qemu-devel@nongnu.org; Thu, 09 Apr 2015 08:21:01 -0400 Received: from mx1.redhat.com ([209.132.183.28]:57919) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YgBS7-0003zP-Dt for qemu-devel@nongnu.org; Thu, 09 Apr 2015 08:20:59 -0400 From: Paolo Bonzini Date: Thu, 9 Apr 2015 14:20:43 +0200 Message-Id: <1428582043-19080-4-git-send-email-pbonzini@redhat.com> In-Reply-To: <1428582043-19080-1-git-send-email-pbonzini@redhat.com> References: <1428582043-19080-1-git-send-email-pbonzini@redhat.com> Subject: [Qemu-devel] [PATCH 3/3] pflash_cfi01: add secure property List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: edgar.iglesias@gmail.com, peter.crosthwaite@xilinx.com, lersek@redhat.com, kraxel@redhat.com, peter.maydell@linaro.org When this property is set, MMIO accesses are only allowed with the MEMTXATTRS_SECURE attribute. This is used for secure access to UEFI variables stored in flash. Signed-off-by: Paolo Bonzini --- hw/block/pflash_cfi01.c | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/hw/block/pflash_cfi01.c b/hw/block/pflash_cfi01.c index 0b3667a..df3b0b0 100644 --- a/hw/block/pflash_cfi01.c +++ b/hw/block/pflash_cfi01.c @@ -65,6 +65,7 @@ do { \ #define CFI_PFLASH01(obj) OBJECT_CHECK(pflash_t, (obj), TYPE_CFI_PFLASH01) #define PFLASH_BE 0 +#define PFLASH_SECURE 1 struct pflash_t { /*< private >*/ @@ -650,25 +651,37 @@ static void pflash_write(pflash_t *pfl, hwaddr offset, } -static uint64_t pflash_mem_read(void *opaque, hwaddr addr, unsigned len) +static MemTxResult pflash_mem_read_with_attrs(void *opaque, hwaddr addr, uint64_t *value, + unsigned len, MemTxAttrs attrs) { pflash_t *pfl = opaque; bool be = !!(pfl->features & (1 << PFLASH_BE)); - return pflash_read(pfl, addr, len, be); + if ((pfl->features & (1 << PFLASH_SECURE)) && !(attrs & MEMTXATTRS_SECURE)) { + return MEMTX_ERROR; + } + + *value = pflash_read(opaque, addr, len, be); + return MEMTX_OK; } -static void pflash_mem_write(void *opaque, hwaddr addr, uint64_t value, unsigned len) +static MemTxResult pflash_mem_write_with_attrs(void *opaque, hwaddr addr, uint64_t value, + unsigned len, MemTxAttrs attrs) { pflash_t *pfl = opaque; bool be = !!(pfl->features & (1 << PFLASH_BE)); - pflash_write(pfl, addr, value, len, be); + if ((pfl->features & (1 << PFLASH_SECURE)) && !(attrs & MEMTXATTRS_SECURE)) { + return MEMTX_ERROR; + } + + pflash_write(opaque, addr, value, len, be); + return MEMTX_OK; } static const MemoryRegionOps pflash_cfi01_ops = { - .read = pflash_mem_read, - .write = pflash_mem_write, + .read_with_attrs = pflash_mem_read_with_attrs, + .write_with_attrs = pflash_mem_write_with_attrs, .endianness = DEVICE_NATIVE_ENDIAN, }; @@ -853,6 +866,7 @@ static Property pflash_cfi01_properties[] = { DEFINE_PROP_UINT8("device-width", struct pflash_t, device_width, 0), DEFINE_PROP_UINT8("max-device-width", struct pflash_t, max_device_width, 0), DEFINE_PROP_BIT("big-endian", struct pflash_t, features, PFLASH_BE, 0), + DEFINE_PROP_BIT("secure", struct pflash_t, features, PFLASH_SECURE, 0), DEFINE_PROP_UINT16("id0", struct pflash_t, ident0, 0), DEFINE_PROP_UINT16("id1", struct pflash_t, ident1, 0), DEFINE_PROP_UINT16("id2", struct pflash_t, ident2, 0), -- 2.3.5