Merge pull request #203 from xiangfu/openwrt Fix a swab32 bug under work_decode on MIPS cpu machine
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
diff --git a/api-example.c b/api-example.c
index ea5d645..13b8f2d 100755
--- a/api-example.c
+++ b/api-example.c
@@ -7,6 +7,10 @@
* any later version. See COPYING for more details.
*/
+/* Compile:
+ * gcc api-example.c -I compat/jansson -o cgminer-api
+ */
+
#include "config.h"
#include <stdio.h>
diff --git a/cgminer.c b/cgminer.c
index 118747b..d8b8e6f 100644
--- a/cgminer.c
+++ b/cgminer.c
@@ -1182,6 +1182,11 @@ static bool work_decode(const json_t *val, struct work *work)
sha2_starts( &ctx, 0 );
sha2_update( &ctx, data.c, 64 );
memcpy(work->midstate, ctx.state, sizeof(work->midstate));
+#if defined(__BIG_ENDIAN__) || defined(MIPSEB)
+ int i;
+ for (i = 0; i < 8; i++)
+ (((uint32_t*) (work->midstate))[i]) = swab32(((uint32_t*) (work->midstate))[i]);
+#endif
}
if (likely(!jobj_binary(val, "hash1", work->hash1, sizeof(work->hash1), false))) {
@@ -1196,18 +1201,6 @@ static bool work_decode(const json_t *val, struct work *work)
memset(work->hash, 0, sizeof(work->hash));
-#ifdef __BIG_ENDIAN__
- int swapcounter = 0;
- for (swapcounter = 0; swapcounter < 32; swapcounter++)
- (((uint32_t*) (work->data))[swapcounter]) = swab32(((uint32_t*) (work->data))[swapcounter]);
- for (swapcounter = 0; swapcounter < 16; swapcounter++)
- (((uint32_t*) (work->hash1))[swapcounter]) = swab32(((uint32_t*) (work->hash1))[swapcounter]);
- for (swapcounter = 0; swapcounter < 8; swapcounter++)
- (((uint32_t*) (work->midstate))[swapcounter]) = swab32(((uint32_t*) (work->midstate))[swapcounter]);
- for (swapcounter = 0; swapcounter < 8; swapcounter++)
- (((uint32_t*) (work->target))[swapcounter]) = swab32(((uint32_t*) (work->target))[swapcounter]);
-#endif
-
gettimeofday(&work->tv_staged, NULL);
return true;
diff --git a/driver-icarus.c b/driver-icarus.c
index dba6617..5ef3300 100644
--- a/driver-icarus.c
+++ b/driver-icarus.c
@@ -350,7 +350,7 @@ static uint64_t icarus_scanhash(struct thr_info *thr, struct work *work,
return ESTIMATE_HASHES;
}
-#ifndef __BIG_ENDIAN__
+#if !defined (__BIG_ENDIAN__) && !defined(MIPSEB)
nonce = swab32(nonce);
#endif