mirror of
https://github.com/GOSTSec/ccminer
synced 2025-01-10 23:08:02 +00:00
scan range: add boundary check, cant be > UINT32_MAX
This commit is contained in:
parent
047e79a9fc
commit
b4ef7b981f
18
blake32.cu
18
blake32.cu
@ -39,8 +39,6 @@ extern "C" void blake256hash(void *output, const void *input, int8_t rounds = 14
|
|||||||
|
|
||||||
#include "cuda_helper.h"
|
#include "cuda_helper.h"
|
||||||
|
|
||||||
#define MAXU 0xffffffffU
|
|
||||||
|
|
||||||
#if PRECALC64
|
#if PRECALC64
|
||||||
__constant__ uint32_t _ALIGN(32) d_data[12];
|
__constant__ uint32_t _ALIGN(32) d_data[12];
|
||||||
#else
|
#else
|
||||||
@ -58,7 +56,7 @@ static uint32_t *h_resNonce[8];
|
|||||||
|
|
||||||
/* max count of found nonces in one call */
|
/* max count of found nonces in one call */
|
||||||
#define NBN 2
|
#define NBN 2
|
||||||
static uint32_t extra_results[NBN] = { MAXU };
|
static uint32_t extra_results[NBN] = { UINT32_MAX };
|
||||||
|
|
||||||
/* prefer uint32_t to prevent size conversions = speed +5/10 % */
|
/* prefer uint32_t to prevent size conversions = speed +5/10 % */
|
||||||
__constant__
|
__constant__
|
||||||
@ -250,7 +248,7 @@ uint32_t blake256_cpu_hash_80(const int thr_id, const uint32_t threads, const ui
|
|||||||
const uint32_t crcsum, const int8_t rounds)
|
const uint32_t crcsum, const int8_t rounds)
|
||||||
{
|
{
|
||||||
const int threadsperblock = TPB;
|
const int threadsperblock = TPB;
|
||||||
uint32_t result = MAXU;
|
uint32_t result = UINT32_MAX;
|
||||||
|
|
||||||
dim3 grid((threads + threadsperblock-1)/threadsperblock);
|
dim3 grid((threads + threadsperblock-1)/threadsperblock);
|
||||||
dim3 block(threadsperblock);
|
dim3 block(threadsperblock);
|
||||||
@ -339,7 +337,7 @@ static uint32_t blake256_cpu_hash_16(const int thr_id, const uint32_t threads, c
|
|||||||
const int8_t rounds)
|
const int8_t rounds)
|
||||||
{
|
{
|
||||||
const int threadsperblock = TPB;
|
const int threadsperblock = TPB;
|
||||||
uint32_t result = MAXU;
|
uint32_t result = UINT32_MAX;
|
||||||
|
|
||||||
dim3 grid((threads + threadsperblock-1)/threadsperblock);
|
dim3 grid((threads + threadsperblock-1)/threadsperblock);
|
||||||
dim3 block(threadsperblock);
|
dim3 block(threadsperblock);
|
||||||
@ -404,12 +402,12 @@ extern "C" int scanhash_blake256(int thr_id, uint32_t *pdata, const uint32_t *pt
|
|||||||
int rc = 0;
|
int rc = 0;
|
||||||
|
|
||||||
#if NBN > 1
|
#if NBN > 1
|
||||||
if (extra_results[0] != MAXU) {
|
if (extra_results[0] != UINT32_MAX) {
|
||||||
// possible extra result found in previous call
|
// possible extra result found in previous call
|
||||||
if (first_nonce <= extra_results[0] && max_nonce >= extra_results[0]) {
|
if (first_nonce <= extra_results[0] && max_nonce >= extra_results[0]) {
|
||||||
pdata[19] = extra_results[0];
|
pdata[19] = extra_results[0];
|
||||||
*hashes_done = pdata[19] - first_nonce + 1;
|
*hashes_done = pdata[19] - first_nonce + 1;
|
||||||
extra_results[0] = MAXU;
|
extra_results[0] = UINT32_MAX;
|
||||||
rc = 1;
|
rc = 1;
|
||||||
goto exit_scan;
|
goto exit_scan;
|
||||||
}
|
}
|
||||||
@ -455,7 +453,7 @@ extern "C" int scanhash_blake256(int thr_id, uint32_t *pdata, const uint32_t *pt
|
|||||||
// GPU FULL HASH
|
// GPU FULL HASH
|
||||||
blake256_cpu_hash_80(thr_id, throughput, pdata[19], targetHigh, crcsum, blakerounds);
|
blake256_cpu_hash_80(thr_id, throughput, pdata[19], targetHigh, crcsum, blakerounds);
|
||||||
#endif
|
#endif
|
||||||
if (foundNonce != MAXU)
|
if (foundNonce != UINT32_MAX)
|
||||||
{
|
{
|
||||||
uint32_t vhashcpu[8];
|
uint32_t vhashcpu[8];
|
||||||
uint32_t Htarg = (uint32_t)targetHigh;
|
uint32_t Htarg = (uint32_t)targetHigh;
|
||||||
@ -472,7 +470,7 @@ extern "C" int scanhash_blake256(int thr_id, uint32_t *pdata, const uint32_t *pt
|
|||||||
pdata[19] = foundNonce;
|
pdata[19] = foundNonce;
|
||||||
rc = 1;
|
rc = 1;
|
||||||
|
|
||||||
if (extra_results[0] != MAXU) {
|
if (extra_results[0] != UINT32_MAX) {
|
||||||
// Rare but possible if the throughput is big
|
// Rare but possible if the throughput is big
|
||||||
be32enc(&endiandata[19], extra_results[0]);
|
be32enc(&endiandata[19], extra_results[0]);
|
||||||
|
|
||||||
@ -481,7 +479,7 @@ extern "C" int scanhash_blake256(int thr_id, uint32_t *pdata, const uint32_t *pt
|
|||||||
applog(LOG_NOTICE, "GPU found more than one result " CL_GRN "yippee!");
|
applog(LOG_NOTICE, "GPU found more than one result " CL_GRN "yippee!");
|
||||||
rc = 2;
|
rc = 2;
|
||||||
} else {
|
} else {
|
||||||
extra_results[0] = MAXU;
|
extra_results[0] = UINT32_MAX;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
22
ccminer.cpp
22
ccminer.cpp
@ -1122,8 +1122,12 @@ static void *miner_thread(void *userdata)
|
|||||||
max64 = max(minmax-1, max64);
|
max64 = max(minmax-1, max64);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (opt_debug)
|
// we can't scan more than uint capacity
|
||||||
applog(LOG_DEBUG, "GPU #%d: start=%08x range=%llx", device_map[thr_id], *nonceptr, max64);
|
max64 = min(UINT32_MAX, max64);
|
||||||
|
|
||||||
|
//if (opt_debug)
|
||||||
|
// applog(LOG_DEBUG, "GPU #%d: start=%08x end=%08x max64=%llx",
|
||||||
|
// device_map[thr_id], *nonceptr, end_nonce, max64);
|
||||||
|
|
||||||
start_nonce = *nonceptr;
|
start_nonce = *nonceptr;
|
||||||
|
|
||||||
@ -1137,7 +1141,7 @@ static void *miner_thread(void *userdata)
|
|||||||
range.data = hashlog_get_scan_range(work.job_id);
|
range.data = hashlog_get_scan_range(work.job_id);
|
||||||
if (range.data && !opt_benchmark) {
|
if (range.data && !opt_benchmark) {
|
||||||
bool stall = false;
|
bool stall = false;
|
||||||
if (range.scanned[0] == 1 && range.scanned[1] == 0xFFFFFFFFUL) {
|
if (range.scanned[0] == 1 && range.scanned[1] == UINT32_MAX) {
|
||||||
applog(LOG_WARNING, "detected a rescan of fully scanned job!");
|
applog(LOG_WARNING, "detected a rescan of fully scanned job!");
|
||||||
} else if (range.scanned[0] > 0 && range.scanned[1] > 0 && range.scanned[1] < 0xFFFFFFF0UL) {
|
} else if (range.scanned[0] > 0 && range.scanned[1] > 0 && range.scanned[1] < 0xFFFFFFF0UL) {
|
||||||
/* continue scan the end */
|
/* continue scan the end */
|
||||||
@ -1163,18 +1167,24 @@ static void *miner_thread(void *userdata)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* never let small ranges at end */
|
||||||
|
if (end_nonce >= UINT32_MAX - 256)
|
||||||
|
end_nonce = UINT32_MAX;
|
||||||
|
|
||||||
if ((max64 + start_nonce) >= end_nonce)
|
if ((max64 + start_nonce) >= end_nonce)
|
||||||
max_nonce = end_nonce;
|
max_nonce = end_nonce;
|
||||||
else
|
else
|
||||||
max_nonce = (uint32_t) (max64 + start_nonce);
|
max_nonce = (uint32_t) (max64 + start_nonce);
|
||||||
|
|
||||||
/* never let small ranges at end */
|
// todo: keep it rounded for gpu threads ?
|
||||||
if (max_nonce >= UINT32_MAX - 256)
|
|
||||||
max_nonce = UINT32_MAX;
|
|
||||||
|
|
||||||
work.scanned_from = start_nonce;
|
work.scanned_from = start_nonce;
|
||||||
(*nonceptr) = start_nonce;
|
(*nonceptr) = start_nonce;
|
||||||
|
|
||||||
|
if (opt_debug)
|
||||||
|
applog(LOG_DEBUG, "GPU #%d: start=%08x end=%08x range=%08x",
|
||||||
|
device_map[thr_id], start_nonce, max_nonce, (max_nonce-start_nonce));
|
||||||
|
|
||||||
hashes_done = 0;
|
hashes_done = 0;
|
||||||
continue_scan:
|
continue_scan:
|
||||||
gettimeofday(&tv_start, NULL);
|
gettimeofday(&tv_start, NULL);
|
||||||
|
@ -28,7 +28,7 @@ extern int device_map[8];
|
|||||||
void stats_remember_speed(int thr_id, uint32_t hashcount, double hashrate, uint8_t found)
|
void stats_remember_speed(int thr_id, uint32_t hashcount, double hashrate, uint8_t found)
|
||||||
{
|
{
|
||||||
uint64_t gpu = device_map[thr_id];
|
uint64_t gpu = device_map[thr_id];
|
||||||
uint64_t key = (gpu << 56) + (uid++ % UINT_MAX);
|
uint64_t key = (gpu << 56) + (uid++ % UINT32_MAX);
|
||||||
stats_data data;
|
stats_data data;
|
||||||
// to enough hashes to give right stats
|
// to enough hashes to give right stats
|
||||||
if (hashcount < 1000 || hashrate < 0.01)
|
if (hashcount < 1000 || hashrate < 0.01)
|
||||||
|
Loading…
Reference in New Issue
Block a user