aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CMakeLists.txt93
-rw-r--r--Makefile18
-rw-r--r--README.md3
-rw-r--r--src/blockchain_db/lmdb/db_lmdb.cpp4
-rw-r--r--src/common/command_line.cpp2
-rw-r--r--src/wallet/wallet2.cpp11
-rw-r--r--tests/CMakeLists.txt4
7 files changed, 110 insertions, 25 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index ff1590860..fb587f9a1 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -76,6 +76,11 @@ if (ARM_TEST STREQUAL "arm")
endif()
endif()
+if (ARCH_ID STREQUAL "aarch64")
+ set(ARM 1)
+ set(ARM8 1)
+endif()
+
if(WIN32 OR ARM)
set(OPT_FLAGS_RELEASE "-O2")
else()
@@ -367,23 +372,89 @@ else()
message(STATUS "AES support enabled")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -maes")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -maes")
- elseif(ARM)
+ elseif(ARM) #NB ARMv8 DOES support AES, but not yet coded
message(STATUS "AES support disabled (not available on ARM)")
else()
message(STATUS "AES support disabled")
endif()
- if(ARM6)
- message(STATUS "Setting ARM6 C and C++ flags")
- set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mfpu=vfp -mfloat-abi=hard")
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mfpu=vfp -mfloat-abi=hard")
- endif()
+ if(ARM)
+ message(STATUS "Setting FPU Flags for ARM Processors")
+ include(TestCXXAcceptsFlag)
+
+ #NB NEON hardware does not fully implement the IEEE 754 standard for floating-point arithmetic
+ #Need custom assembly code to take full advantage of NEON SIMD
+
+ #Cortex-A5/9 -mfpu=neon-fp16
+ #Cortex-A7/15 -mfpu=neon-vfpv4
+ #Cortex-A8 -mfpu=neon
+ #ARMv8 -FP and SIMD on by default for all ARM8v-a series, NO -mfpu setting needed
+
+ #For custom -mtune, processor IDs for ARMv8-A series:
+ #0xd04 - Cortex-A35
+ #0xd07 - Cortex-A57
+ #0xd08 - Cortex-A72
+ #0xd03 - Cortex-A73
+
+ if(NOT ARM8)
+ CHECK_CXX_ACCEPTS_FLAG(-mfpu=vfp3-d16 CXX_ACCEPTS_VFP3_D16)
+ CHECK_CXX_ACCEPTS_FLAG(-mfpu=vfp4 CXX_ACCEPTS_VFP4)
+ CHECK_CXX_ACCEPTS_FLAG(-mfloat-abi=hard CXX_ACCEPTS_MFLOAT_HARD)
+ CHECK_CXX_ACCEPTS_FLAG(-mfloat-abi=softfp CXX_ACCEPTS_MFLOAT_SOFTFP)
+ endif()
- if(ARM7)
- message(STATUS "Setting ARM7 C and C++ flags")
- set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mfloat-abi=hard")
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mfloat-abi=hard")
- endif()
+ if(ARM8)
+ CHECK_CXX_ACCEPTS_FLAG(-mfix-cortex-a53-835769 CXX_ACCEPTS_MFIX_CORTEX_A53_835769)
+ CHECK_CXX_ACCEPTS_FLAG(-mfix-cortex-a53-843419 CXX_ACCEPTS_MFIX_CORTEX_A53_843419)
+ endif()
+
+ if(ARM6)
+ message(STATUS "Selecting VFP for ARMv6")
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mfpu=vfp")
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mfpu=vfp")
+ endif(ARM6)
+
+ if(ARM7)
+ if(CXX_ACCEPTS_VFP3_D16 AND NOT CXX_ACCEPTS_VFP4)
+ message(STATUS "Selecting VFP3 for ARMv7")
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mfpu=vfp3-d16")
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mfpu=vfp3-d16")
+ endif()
+
+ if(CXX_ACCEPTS_VFP4)
+ message(STATUS "Selecting VFP4 for ARMv7")
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mfpu=vfp4")
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mfpu=vfp4")
+ endif()
+
+ if(CXX_ACCEPTS_MFLOAT_HARD)
+ message(STATUS "Setting Hardware ABI for Floating Point")
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mfloat-abi=hard")
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mfloat-abi=hard")
+ endif()
+
+ if(CXX_ACCEPTS_MFLOAT_SOFTFP AND NOT CXX_ACCEPTS_MFLOAT_HARD)
+ message(STATUS "Setting Software ABI for Floating Point")
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mfloat-abi=softfp")
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mfloat-abi=softfp")
+ endif()
+ endif(ARM7)
+
+ if(ARM8)
+ if(CXX_ACCEPTS_MFIX_CORTEX_A53_835769)
+ message(STATUS "Enabling Cortex-A53 workaround 835769")
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mfix-cortex-a53-835769")
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mfix-cortex-a53-835769")
+ endif()
+
+ if(CXX_ACCEPTS_MFIX_CORTEX_A53_843419)
+ message(STATUS "Enabling Cortex-A53 workaround 843419")
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mfix-cortex-a53-843419")
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mfix-cortex-a53-843419")
+ endif()
+ endif(ARM8)
+
+ endif(ARM)
if(APPLE)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DGTEST_HAS_TR1_TUPLE=0")
diff --git a/Makefile b/Makefile
index 8ddd60056..142111465 100644
--- a/Makefile
+++ b/Makefile
@@ -1,21 +1,21 @@
# Copyright (c) 2014-2016, The Monero Project
-#
+#
# All rights reserved.
-#
+#
# Redistribution and use in source and binary forms, with or without modification, are
# permitted provided that the following conditions are met:
-#
+#
# 1. Redistributions of source code must retain the above copyright notice, this list of
# conditions and the following disclaimer.
-#
+#
# 2. Redistributions in binary form must reproduce the above copyright notice, this list
# of conditions and the following disclaimer in the documentation and/or other
# materials provided with the distribution.
-#
+#
# 3. Neither the name of the copyright holder nor the names of its contributors may be
# used to endorse or promote products derived from this software without specific
# prior written permission.
-#
+#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
@@ -65,7 +65,11 @@ release-static-arm6:
release-static-arm7:
mkdir -p build/release
cd build/release && cmake -D BUILD_TESTS=OFF -D ARCH="armv7-a" -D STATIC=ON -D BUILD_64=OFF -D CMAKE_BUILD_TYPE=release ../.. && $(MAKE)
-
+
+release-static-armv8:
+ mkdir -p build/release
+ cd build/release && cmake -D BUILD_TESTS=OFF -D ARCH="armv8-a" -D STATIC=ON -D BUILD_64=ON -D CMAKE_BUILD_TYPE=release ../.. && $(MAKE)
+
release-static: release-static-64
release-static-64:
diff --git a/README.md b/README.md
index 1f3e7dced..d7251bf46 100644
--- a/README.md
+++ b/README.md
@@ -197,7 +197,8 @@ By default, in either dynamically or statically linked builds, binaries target t
* ```make release-static-64``` builds binaries on Linux on x86_64 portable across POSIX systems on x86_64 processors
* ```make release-static-32``` builds binaries on Linux on x86_64 or i686 portable across POSIX systems on i686 processors
-* ```make release-static-arm7``` builds binaries on Linux on armv7 portable across POSIX systesm on armv7 processors
+* ```make release-static-arm8``` builds binaries on Linux on armv8 portable across POSIX systems on armv8 processors
+* ```make release-static-arm7``` builds binaries on Linux on armv7 portable across POSIX systems on armv7 processors
* ```make release-static-arm6``` builds binaries on Linux on armv7 or armv6 portable across POSIX systems on armv6 processors, such as the Raspberry Pi
* ```make release-static-win64``` builds binaries on 64-bit Windows portable across 64-bit Windows systems
* ```make release-static-win32``` builds binaries on 64-bit or 32-bit Windows portable across 32-bit Windows systems
diff --git a/src/blockchain_db/lmdb/db_lmdb.cpp b/src/blockchain_db/lmdb/db_lmdb.cpp
index a0a0a041d..c0cf28dda 100644
--- a/src/blockchain_db/lmdb/db_lmdb.cpp
+++ b/src/blockchain_db/lmdb/db_lmdb.cpp
@@ -877,10 +877,12 @@ void BlockchainLMDB::remove_tx_outputs(const uint64_t tx_id, const transaction&
throw0(DB_ERROR("tx has outputs, but no output indices found"));
}
+ bool is_miner_tx = tx.vin.size() == 1 && tx.vin[0].type() == typeid(txin_gen);
for (uint64_t i = tx.vout.size(); i > 0; --i)
{
const tx_out tx_output = tx.vout[i-1];
- remove_output(tx_output.amount, amount_output_indices[i-1]);
+ uint64_t amount = is_miner_tx && tx.version >= 2 ? 0 : tx_output.amount;
+ remove_output(amount, amount_output_indices[i-1]);
}
}
diff --git a/src/common/command_line.cpp b/src/common/command_line.cpp
index 98ff73bc5..90db3b04d 100644
--- a/src/common/command_line.cpp
+++ b/src/common/command_line.cpp
@@ -69,7 +69,7 @@ namespace command_line
const command_line::arg_descriptor<std::string> arg_db_sync_mode = {
"db-sync-mode"
, "Specify sync option, using format [safe|fast|fastest]:[sync|async]:[nblocks_per_sync]."
- , "fastest:async:1000"
+ , "fast:async:1000"
};
const command_line::arg_descriptor<uint64_t> arg_fast_block_sync = {
"fast-block-sync"
diff --git a/src/wallet/wallet2.cpp b/src/wallet/wallet2.cpp
index 99866dbeb..d889720af 100644
--- a/src/wallet/wallet2.cpp
+++ b/src/wallet/wallet2.cpp
@@ -2682,8 +2682,8 @@ void wallet2::get_outs(std::vector<std::vector<entry>> &outs, const std::list<tr
THROW_WALLET_EXCEPTION_IF(resp_t.result.status != CORE_RPC_STATUS_OK, error::get_histogram_error, resp_t.result.status);
// we ask for more, to have spares if some outputs are still locked
- size_t requested_outputs_count = (size_t)((fake_outputs_count + 1) * 1.5 + 1);
- LOG_PRINT_L2("requested_outputs_count: " << requested_outputs_count);
+ size_t base_requested_outputs_count = (size_t)((fake_outputs_count + 1) * 1.5 + 1);
+ LOG_PRINT_L2("base_requested_outputs_count: " << base_requested_outputs_count);
// generate output indices to request
COMMAND_RPC_GET_OUTPUTS::request req = AUTO_VAL_INIT(req);
@@ -2693,6 +2693,8 @@ void wallet2::get_outs(std::vector<std::vector<entry>> &outs, const std::list<tr
{
const uint64_t amount = it->is_rct() ? 0 : it->amount();
std::unordered_set<uint64_t> seen_indices;
+ // request more for rct in base recent (locked) coinbases are picked, since they're locked for longer
+ size_t requested_outputs_count = base_requested_outputs_count + (it->is_rct() ? CRYPTONOTE_MINED_MONEY_UNLOCK_WINDOW - CRYPTONOTE_DEFAULT_TX_SPENDABLE_AGE : 0);
size_t start = req.outputs.size();
// if there are just enough outputs to mix with, use all of them.
@@ -2777,6 +2779,7 @@ void wallet2::get_outs(std::vector<std::vector<entry>> &outs, const std::list<tr
outs.reserve(selected_transfers.size());
for(transfer_container::iterator it: selected_transfers)
{
+ size_t requested_outputs_count = base_requested_outputs_count + (it->is_rct() ? CRYPTONOTE_MINED_MONEY_UNLOCK_WINDOW - CRYPTONOTE_DEFAULT_TX_SPENDABLE_AGE : 0);
outs.push_back(std::vector<entry>());
outs.back().reserve(fake_outputs_count + 1);
const rct::key mask = it->is_rct() ? rct::commit(it->amount(), it->m_mask) : rct::zeroCommit(it->amount());
@@ -2792,9 +2795,11 @@ void wallet2::get_outs(std::vector<std::vector<entry>> &outs, const std::list<tr
order[n] = n;
std::shuffle(order.begin(), order.end(), std::default_random_engine(crypto::rand<unsigned>()));
+ LOG_PRINT_L2("Looking for " << (fake_outputs_count+1) << " outputs of size " << print_money(it->is_rct() ? 0 : it->amount()));
for (size_t o = 0; o < requested_outputs_count && outs.back().size() < fake_outputs_count + 1; ++o)
{
size_t i = base + order[o];
+ LOG_PRINT_L2("Index " << i << "/" << requested_outputs_count << ": idx " << req.outputs[i].index << " (real " << it->m_global_output_index << "), unlocked " << daemon_resp.outs[i].unlocked << ", key " << daemon_resp.outs[i].key);
if (req.outputs[i].index == it->m_global_output_index) // don't re-add real one
continue;
if (!daemon_resp.outs[i].unlocked) // don't add locked outs
@@ -2805,7 +2810,7 @@ void wallet2::get_outs(std::vector<std::vector<entry>> &outs, const std::list<tr
}
if (outs.back().size() < fake_outputs_count + 1)
{
- scanty_outs[it->amount()] = outs.back().size();
+ scanty_outs[it->is_rct() ? 0 : it->amount()] = outs.back().size();
}
else
{
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index daaa078db..33f5226ef 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -54,7 +54,9 @@ else ()
endif()
endif ()
-add_subdirectory(core_tests)
+if (NOT DEFINED ENV{TRAVIS})
+ add_subdirectory(core_tests)
+endif ()
add_subdirectory(crypto)
add_subdirectory(functional_tests)
add_subdirectory(performance_tests)