[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL v2 15/21] hw/mips: implement ITC Storage - P/V Sync a
From: |
Leon Alrae |
Subject: |
[Qemu-devel] [PULL v2 15/21] hw/mips: implement ITC Storage - P/V Sync and Try Views |
Date: |
Wed, 30 Mar 2016 09:49:56 +0100 |
P/V Synchronized and Try Views can be used to access Semaphore cells.
Load returns current value and post-decrements the value in the cell
(until it reaches zero). Stores increment the value (until it saturates
at 0xFFFF).
P/V Synchronized View causes the issuing thread to block on read if value
is 0. P/V Try View does not block the thread, it returns 0 in this case.
Cell's Empty and Full bits are not modified.
Trap bit (i.e. Gating Storage exceptions) not implemented.
Signed-off-by: Leon Alrae <address@hidden>
---
hw/misc/mips_itu.c | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 68 insertions(+)
diff --git a/hw/misc/mips_itu.c b/hw/misc/mips_itu.c
index 24a1474..595d2d2 100644
--- a/hw/misc/mips_itu.c
+++ b/hw/misc/mips_itu.c
@@ -33,6 +33,8 @@
#define ITC_SEMAPH_NUM_MAX 16
#define ITC_AM1_NUMENTRIES_OFS 20
+#define ITC_CELL_PV_MAX_VAL 0xFFFF
+
#define ITC_CELL_TAG_FIFO_DEPTH 28
#define ITC_CELL_TAG_FIFO_PTR 18
#define ITC_CELL_TAG_FIFO 17
@@ -284,6 +286,60 @@ static void view_ef_try_write(ITCStorageCell *c, uint64_t
val)
view_ef_common_write(c, val, false);
}
+/* ITC P/V View */
+
+static uint64_t view_pv_common_read(ITCStorageCell *c, bool blocking)
+{
+ uint64_t ret = c->data[0];
+
+ if (c->tag.FIFO) {
+ return 0;
+ }
+
+ if (c->data[0] > 0) {
+ c->data[0]--;
+ } else if (blocking) {
+ block_thread_and_exit(c);
+ }
+
+ return ret;
+}
+
+static uint64_t view_pv_sync_read(ITCStorageCell *c)
+{
+ return view_pv_common_read(c, true);
+}
+
+static uint64_t view_pv_try_read(ITCStorageCell *c)
+{
+ return view_pv_common_read(c, false);
+}
+
+static inline void view_pv_common_write(ITCStorageCell *c)
+{
+ if (c->tag.FIFO) {
+ return;
+ }
+
+ if (c->data[0] < ITC_CELL_PV_MAX_VAL) {
+ c->data[0]++;
+ }
+
+ if (c->blocked_threads) {
+ wake_blocked_threads(c);
+ }
+}
+
+static void view_pv_sync_write(ITCStorageCell *c)
+{
+ view_pv_common_write(c);
+}
+
+static void view_pv_try_write(ITCStorageCell *c)
+{
+ view_pv_common_write(c);
+}
+
static uint64_t itc_storage_read(void *opaque, hwaddr addr, unsigned size)
{
MIPSITUState *s = (MIPSITUState *)opaque;
@@ -301,6 +357,12 @@ static uint64_t itc_storage_read(void *opaque, hwaddr
addr, unsigned size)
case ITCVIEW_EF_TRY:
ret = view_ef_try_read(cell);
break;
+ case ITCVIEW_PV_SYNC:
+ ret = view_pv_sync_read(cell);
+ break;
+ case ITCVIEW_PV_TRY:
+ ret = view_pv_try_read(cell);
+ break;
default:
qemu_log_mask(LOG_GUEST_ERROR,
"itc_storage_read: Bad ITC View %d\n", (int)view);
@@ -327,6 +389,12 @@ static void itc_storage_write(void *opaque, hwaddr addr,
uint64_t data,
case ITCVIEW_EF_TRY:
view_ef_try_write(cell, data);
break;
+ case ITCVIEW_PV_SYNC:
+ view_pv_sync_write(cell);
+ break;
+ case ITCVIEW_PV_TRY:
+ view_pv_try_write(cell);
+ break;
default:
qemu_log_mask(LOG_GUEST_ERROR,
"itc_storage_write: Bad ITC View %d\n", (int)view);
--
2.1.0
- [Qemu-devel] [PULL v2 01/21] hw/mips: implement generic MIPS Coherent Processing System container, (continued)
- [Qemu-devel] [PULL v2 01/21] hw/mips: implement generic MIPS Coherent Processing System container, Leon Alrae, 2016/03/30
- [Qemu-devel] [PULL v2 03/21] hw/mips: add initial Global Config Register support, Leon Alrae, 2016/03/30
- [Qemu-devel] [PULL v2 06/21] hw/mips/cps: create CPC block inside CPS, Leon Alrae, 2016/03/30
- [Qemu-devel] [PULL v2 09/21] hw/mips_malta: move CPU creation to a separate function, Leon Alrae, 2016/03/30
- [Qemu-devel] [PULL v2 16/21] hw/mips: implement ITC Storage - Bypass View, Leon Alrae, 2016/03/30
- [Qemu-devel] [PULL v2 11/21] target-mips: enable CM GCR in MIPS64R6-generic CPU, Leon Alrae, 2016/03/30
- [Qemu-devel] [PULL v2 12/21] hw/mips: implement ITC Configuration Tags and Storage Cells, Leon Alrae, 2016/03/30
- [Qemu-devel] [PULL v2 19/21] hw/mips/cps: enable ITU for multithreading processors, Leon Alrae, 2016/03/30
- [Qemu-devel] [PULL v2 20/21] target-mips: use CP0_CHECK for gen_m{f|t}hc0, Leon Alrae, 2016/03/30
- [Qemu-devel] [PULL v2 14/21] hw/mips: implement ITC Storage - Empty/Full Sync and Try Views, Leon Alrae, 2016/03/30
- [Qemu-devel] [PULL v2 15/21] hw/mips: implement ITC Storage - P/V Sync and Try Views,
Leon Alrae <=
- [Qemu-devel] [PULL v2 07/21] hw/mips_malta: remove CPUMIPSState from the write_bootloader(), Leon Alrae, 2016/03/30
- [Qemu-devel] [PULL v2 08/21] hw/mips_malta: remove redundant irq and clock init, Leon Alrae, 2016/03/30
- [Qemu-devel] [PULL v2 17/21] target-mips: check CP0 enabled for CACHE instruction also in R6, Leon Alrae, 2016/03/30
- [Qemu-devel] [PULL v2 18/21] target-mips: make ITC Configuration Tags accessible to the CPU, Leon Alrae, 2016/03/30
- [Qemu-devel] [PULL v2 21/21] target-mips: add MAAR, MAARI register, Leon Alrae, 2016/03/30
- Re: [Qemu-devel] [PULL v2 00/21] target-mips queue for 2.6, Peter Maydell, 2016/03/30