From c52ae38779ae027db7034abd9b0a61970df8dd45 Mon Sep 17 00:00:00 2001 From: Ryan Buchner Date: Thu, 21 Apr 2022 11:19:54 -0700 Subject: Add require_alignment tag to store_func Will be used similarly as in load_func. --- riscv/mmu.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/riscv/mmu.h b/riscv/mmu.h index dcf338f..03a2d39 100644 --- a/riscv/mmu.h +++ b/riscv/mmu.h @@ -147,7 +147,7 @@ public: // template for functions that store an aligned value to memory #define store_func(type, prefix, xlate_flags) \ - void prefix##_##type(reg_t addr, type##_t val, bool actually_store=true) { \ + void prefix##_##type(reg_t addr, type##_t val, bool actually_store=true, bool require_alignment=false) { \ if (unlikely(addr & (sizeof(type##_t)-1))) \ return misaligned_store(addr, val, sizeof(type##_t), xlate_flags); \ reg_t vpn = addr >> PGSHIFT; \ -- cgit v1.1 From 004bdc492710e0abd23771fdba33097a9ae1f792 Mon Sep 17 00:00:00 2001 From: Ryan Buchner Date: Thu, 21 Apr 2022 11:21:27 -0700 Subject: Set require alignment to true on the 'fake' store in amo_func. --- riscv/mmu.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/riscv/mmu.h b/riscv/mmu.h index 03a2d39..c08acd3 100644 --- a/riscv/mmu.h +++ b/riscv/mmu.h @@ -196,7 +196,7 @@ public: template \ type##_t amo_##type(reg_t addr, op f) { \ convert_load_traps_to_store_traps({ \ - store_##type(addr, 0, false); \ + store_##type(addr, 0, false, true); \ auto lhs = load_##type(addr, true); \ store_##type(addr, f(lhs)); \ return lhs; \ -- cgit v1.1 From 61eba540e15d4f27d8c3a78b605c614096b3e552 Mon Sep 17 00:00:00 2001 From: Ryan Buchner Date: Thu, 21 Apr 2022 11:23:35 -0700 Subject: Modify store_func to throw fault if misaligned and require_alignment=true --- riscv/mmu.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/riscv/mmu.h b/riscv/mmu.h index c08acd3..415cf1a 100644 --- a/riscv/mmu.h +++ b/riscv/mmu.h @@ -148,8 +148,10 @@ public: // template for functions that store an aligned value to memory #define store_func(type, prefix, xlate_flags) \ void prefix##_##type(reg_t addr, type##_t val, bool actually_store=true, bool require_alignment=false) { \ - if (unlikely(addr & (sizeof(type##_t)-1))) \ - return misaligned_store(addr, val, sizeof(type##_t), xlate_flags); \ + if (unlikely(addr & (sizeof(type##_t)-1))) { \ + if (require_alignment) store_conditional_address_misaligned(addr); \ + else return misaligned_store(addr, val, sizeof(type##_t), xlate_flags); \ + } \ reg_t vpn = addr >> PGSHIFT; \ size_t size = sizeof(type##_t); \ if ((xlate_flags) == 0 && likely(tlb_store_tag[vpn % TLB_ENTRIES] == vpn)) { \ -- cgit v1.1 From 8948aef6dcad90fd80d6b8267e2fc2eeb4163a64 Mon Sep 17 00:00:00 2001 From: Ryan Buchner Date: Thu, 21 Apr 2022 11:35:26 -0700 Subject: Add actually_store tag to misaligned_store function Is passed along to the contained store_func. --- riscv/mmu.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/riscv/mmu.h b/riscv/mmu.h index 415cf1a..bb4c27e 100644 --- a/riscv/mmu.h +++ b/riscv/mmu.h @@ -65,11 +65,11 @@ public: #endif } - inline void misaligned_store(reg_t addr, reg_t data, size_t size, uint32_t xlate_flags) + inline void misaligned_store(reg_t addr, reg_t data, size_t size, uint32_t xlate_flags, bool actually_store=true) { #ifdef RISCV_ENABLE_MISALIGNED for (size_t i = 0; i < size; i++) - store_uint8(addr + (target_big_endian? size-1-i : i), data >> (i * 8)); + store_uint8(addr + (target_big_endian? size-1-i : i), data >> (i * 8), actually_store); #else bool gva = ((proc) ? proc->state.v : false) || (RISCV_XLATE_VIRT & xlate_flags); throw trap_store_address_misaligned(gva, addr, 0, 0); -- cgit v1.1 From 01b88b06693d91ee3d2e5b80020e0b934828d47d Mon Sep 17 00:00:00 2001 From: Ryan Buchner Date: Thu, 21 Apr 2022 11:40:32 -0700 Subject: Pass acutally_store from store_func to misaligned_store In future, someone may expect this functionality. --- riscv/mmu.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/riscv/mmu.h b/riscv/mmu.h index bb4c27e..8964e29 100644 --- a/riscv/mmu.h +++ b/riscv/mmu.h @@ -150,7 +150,7 @@ public: void prefix##_##type(reg_t addr, type##_t val, bool actually_store=true, bool require_alignment=false) { \ if (unlikely(addr & (sizeof(type##_t)-1))) { \ if (require_alignment) store_conditional_address_misaligned(addr); \ - else return misaligned_store(addr, val, sizeof(type##_t), xlate_flags); \ + else return misaligned_store(addr, val, sizeof(type##_t), xlate_flags, actually_store); \ } \ reg_t vpn = addr >> PGSHIFT; \ size_t size = sizeof(type##_t); \ -- cgit v1.1