aboutsummaryrefslogtreecommitdiff
path: root/reginfo.c
diff options
context:
space:
mode:
authorAlex Bennée <alex.bennee@linaro.org>2017-06-21 16:42:38 +0100
committerPeter Maydell <peter.maydell@linaro.org>2017-06-29 11:56:08 +0100
commitcb6c52b42559a0730cf6d7ae7ed841e31399496f (patch)
tree7bda0bf6445062f85d2f511dd28336a261067137 /reginfo.c
parent471b24f6d36610a143ecdcb851b752d62e7572b0 (diff)
risu: parameterise send/receive functions
This is a precursor to record/playback support. Instead of passing the socket fd we now pass helper functions for reading/writing and responding. This will allow us to do the rest of the record/playback cleanly outside of the main worker function. Signed-off-by: Alex Bennée <alex.bennee@linaro.org> Message-id: 20170621154244.28309-5-alex.bennee@linaro.org Reviewed-by: Peter Maydell <peter.maydell@linaro.org> [PMM: fixed checkpatch nits] Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Diffstat (limited to 'reginfo.c')
-rw-r--r--reginfo.c39
1 files changed, 19 insertions, 20 deletions
diff --git a/reginfo.c b/reginfo.c
index 31bb99f..6f489d2 100644
--- a/reginfo.c
+++ b/reginfo.c
@@ -21,7 +21,7 @@ uint8_t apprentice_memblock[MEMBLOCKLEN];
static int mem_used;
static int packet_mismatch;
-int send_register_info(int sock, void *uc)
+int send_register_info(write_fn write_fn, void *uc)
{
struct reginfo ri;
int op;
@@ -29,24 +29,24 @@ int send_register_info(int sock, void *uc)
op = get_risuop(&ri);
switch (op) {
- case OP_COMPARE:
case OP_TESTEND:
- default:
- /* Do a simple register compare on (a) explicit request
- * (b) end of test (c) a non-risuop UNDEF
- */
- return send_data_pkt(sock, &ri, sizeof(ri));
+ return write_fn(&ri, sizeof(ri));
case OP_SETMEMBLOCK:
- memblock = (void *) (uintptr_t) get_reginfo_paramreg(&ri);
+ memblock = (void *)(uintptr_t)get_reginfo_paramreg(&ri);
break;
case OP_GETMEMBLOCK:
set_ucontext_paramreg(uc,
- get_reginfo_paramreg(&ri) +
- (uintptr_t) memblock);
+ get_reginfo_paramreg(&ri) + (uintptr_t)memblock);
break;
case OP_COMPAREMEM:
- return send_data_pkt(sock, memblock, MEMBLOCKLEN);
+ return write_fn(memblock, MEMBLOCKLEN);
break;
+ case OP_COMPARE:
+ default:
+ /* Do a simple register compare on (a) explicit request
+ * (b) end of test (c) a non-risuop UNDEF
+ */
+ return write_fn(&ri, sizeof(ri));
}
return 0;
}
@@ -59,7 +59,8 @@ int send_register_info(int sock, void *uc)
* that says whether it is register or memory data, so if the two
* sides get out of sync then we will fail obscurely.
*/
-int recv_and_compare_register_info(int sock, void *uc)
+int recv_and_compare_register_info(read_fn read_fn,
+ respond_fn resp_fn, void *uc)
{
int resp = 0, op;
@@ -73,36 +74,34 @@ int recv_and_compare_register_info(int sock, void *uc)
/* Do a simple register compare on (a) explicit request
* (b) end of test (c) a non-risuop UNDEF
*/
- if (recv_data_pkt(sock, &apprentice_ri, sizeof(apprentice_ri))) {
+ if (read_fn(&apprentice_ri, sizeof(apprentice_ri))) {
packet_mismatch = 1;
resp = 2;
-
} else if (!reginfo_is_eq(&master_ri, &apprentice_ri)) {
/* register mismatch */
resp = 2;
-
} else if (op == OP_TESTEND) {
resp = 1;
}
- send_response_byte(sock, resp);
+ resp_fn(resp);
break;
case OP_SETMEMBLOCK:
- memblock = (void *) (uintptr_t) get_reginfo_paramreg(&master_ri);
+ memblock = (void *)(uintptr_t)get_reginfo_paramreg(&master_ri);
break;
case OP_GETMEMBLOCK:
set_ucontext_paramreg(uc, get_reginfo_paramreg(&master_ri) +
- (uintptr_t) memblock);
+ (uintptr_t)memblock);
break;
case OP_COMPAREMEM:
mem_used = 1;
- if (recv_data_pkt(sock, apprentice_memblock, MEMBLOCKLEN)) {
+ if (read_fn(apprentice_memblock, MEMBLOCKLEN)) {
packet_mismatch = 1;
resp = 2;
} else if (memcmp(memblock, apprentice_memblock, MEMBLOCKLEN) != 0) {
/* memory mismatch */
resp = 2;
}
- send_response_byte(sock, resp);
+ resp_fn(resp);
break;
}