manawyrm submitted this change.

View Change

Approvals: pespin: Looks good to me, but someone else must approve Jenkins Builder: Verified fixeria: Looks good to me, approved
Transceiver52M: fix viterbi-eq soft bits on platforms where char is unsigned

The viterbi-eq demodulator stores soft bits into chars.
"char" is signed on x86/amd64 but unsigned on arm64.
On arm64 the stored byte 0x81 (== -127) is read back as +129, so after the
sign flip and vectorSlicer() clamp every soft bit collapses to 0.0.

The same issue also appears to be present in the MS code path, so it was
(blindly) fixed there as well. The MS fixes are untested!

Change-Id: I1cda66228f3d48e1b941b25614d599c16ad79aa0
---
M Transceiver52M/Transceiver.cpp
M Transceiver52M/grgsm_vitac/grgsm_vitac.cpp
M Transceiver52M/grgsm_vitac/grgsm_vitac.h
M Transceiver52M/ms/ms.h
M Transceiver52M/ms/ms_rx_lower.cpp
M Transceiver52M/ms/ms_upper.h
M utils/va-test/burst-gen.cpp
7 files changed, 36 insertions(+), 18 deletions(-)

diff --git a/Transceiver52M/Transceiver.cpp b/Transceiver52M/Transceiver.cpp
index 17bf148..46d06db 100644
--- a/Transceiver52M/Transceiver.cpp
+++ b/Transceiver52M/Transceiver.cpp
@@ -623,7 +623,7 @@
std::complex<float> chan_imp_resp[CHAN_IMP_RESP_LENGTH * d_OSR];
float ncmax;
const unsigned burst_len_bits = 148 + 8;
- char demodded_softbits[burst_len_bits];
+ sbit_t demodded_softbits[burst_len_bits];
SoftVector *bits = new SoftVector(burst_len_bits);

if (type == CorrType::TSC) {
diff --git a/Transceiver52M/grgsm_vitac/grgsm_vitac.cpp b/Transceiver52M/grgsm_vitac/grgsm_vitac.cpp
index 2016541..9cba859 100644
--- a/Transceiver52M/grgsm_vitac/grgsm_vitac.cpp
+++ b/Transceiver52M/grgsm_vitac/grgsm_vitac.cpp
@@ -39,6 +39,10 @@
#include "viterbi_detector.h"
#include "grgsm_vitac.h"

+extern "C" {
+#include <osmocom/core/bits.h>
+}
+
gr_complex d_acc_training_seq[N_ACCESS_BITS]; ///<encoded training sequence of a RACH burst
gr_complex d_sch_training_seq[N_SYNC_BITS]; ///<encoded training sequence of a SCH burst
gr_complex d_norm_training_seq[TRAIN_SEQ_NUM][N_TRAIN_BITS]; ///<encoded training sequences of a normal and dummy burst
@@ -77,7 +81,7 @@

template <unsigned int burst_size>
NO_UBSAN static void detect_burst_generic(const gr_complex *input, gr_complex *chan_imp_resp, int burst_start,
- char *output_binary, int ss)
+ sbit_t *output_binary, int ss)
{
std::vector<gr_complex> rhh_temp(CHAN_IMP_RESP_LENGTH * d_OSR);
unsigned int stop_states[2] = { 4, 12 };
@@ -98,22 +102,22 @@
output_binary[i] = output[i] > 0 ? -127 : 127; // pre flip bits!
}

-NO_UBSAN void detect_burst_nb(const gr_complex *input, gr_complex *chan_imp_resp, int burst_start, char *output_binary,
+NO_UBSAN void detect_burst_nb(const gr_complex *input, gr_complex *chan_imp_resp, int burst_start, sbit_t *output_binary,
int ss)
{
return detect_burst_generic<BURST_SIZE>(input, chan_imp_resp, burst_start, output_binary, ss);
}
-NO_UBSAN void detect_burst_ab(const gr_complex *input, gr_complex *chan_imp_resp, int burst_start, char *output_binary,
+NO_UBSAN void detect_burst_ab(const gr_complex *input, gr_complex *chan_imp_resp, int burst_start, sbit_t *output_binary,
int ss)
{
return detect_burst_generic<8 + 41 + 36 + 3>(input, chan_imp_resp, burst_start, output_binary, ss);
}

-NO_UBSAN void detect_burst_nb(const gr_complex *input, gr_complex *chan_imp_resp, int burst_start, char *output_binary)
+NO_UBSAN void detect_burst_nb(const gr_complex *input, gr_complex *chan_imp_resp, int burst_start, sbit_t *output_binary)
{
return detect_burst_nb(input, chan_imp_resp, burst_start, output_binary, 3);
}
-NO_UBSAN void detect_burst_ab(const gr_complex *input, gr_complex *chan_imp_resp, int burst_start, char *output_binary)
+NO_UBSAN void detect_burst_ab(const gr_complex *input, gr_complex *chan_imp_resp, int burst_start, sbit_t *output_binary)
{
return detect_burst_ab(input, chan_imp_resp, burst_start, output_binary, 3);
}
diff --git a/Transceiver52M/grgsm_vitac/grgsm_vitac.h b/Transceiver52M/grgsm_vitac/grgsm_vitac.h
index c1e470c..084fde2 100644
--- a/Transceiver52M/grgsm_vitac/grgsm_vitac.h
+++ b/Transceiver52M/grgsm_vitac/grgsm_vitac.h
@@ -24,6 +24,10 @@
#include <vector>
#include "constants.h"

+extern "C" {
+#include <osmocom/core/bits.h>
+}
+
/* may only be used for for the DEFINITIONS!
* see https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91664
*/
@@ -63,10 +67,10 @@
int process_vita_burst(gr_complex *input, int tsc, unsigned char *output_binary);
int process_vita_sc_burst(gr_complex *input, int tsc, unsigned char *output_binary, int *offset);

-void detect_burst_nb(const gr_complex *input, gr_complex *chan_imp_resp, int burst_start, char *output_binary, int ss);
-void detect_burst_ab(const gr_complex *input, gr_complex *chan_imp_resp, int burst_start, char *output_binary, int ss);
-void detect_burst_nb(const gr_complex *input, gr_complex *chan_imp_resp, int burst_start, char *output_binary);
-void detect_burst_ab(const gr_complex *input, gr_complex *chan_imp_resp, int burst_start, char *output_binary);
+void detect_burst_nb(const gr_complex *input, gr_complex *chan_imp_resp, int burst_start, sbit_t *output_binary, int ss);
+void detect_burst_ab(const gr_complex *input, gr_complex *chan_imp_resp, int burst_start, sbit_t *output_binary, int ss);
+void detect_burst_nb(const gr_complex *input, gr_complex *chan_imp_resp, int burst_start, sbit_t *output_binary);
+void detect_burst_ab(const gr_complex *input, gr_complex *chan_imp_resp, int burst_start, sbit_t *output_binary);

void gmsk_mapper(const unsigned char *input, int nitems, gr_complex *gmsk_output, gr_complex start_point);
gr_complex correlate_sequence(const gr_complex *sequence, int length, const gr_complex *input);
diff --git a/Transceiver52M/ms/ms.h b/Transceiver52M/ms/ms.h
index 2ad78de..70e7445 100644
--- a/Transceiver52M/ms/ms.h
+++ b/Transceiver52M/ms/ms.h
@@ -43,6 +43,9 @@
#include "itrq.h"
#include "threadpool.h"
#include "threadsched.h"
+extern "C" {
+#include <osmocom/core/bits.h>
+}

const unsigned int ONE_TS_BURST_LEN = (3 + 58 + 26 + 58 + 3 + 8.25) * 4 /*sps*/;
const unsigned int SCH_LEN_SPS = (ONE_TS_BURST_LEN * 8 /*ts*/ * 12 /*frames*/);
@@ -129,7 +132,7 @@
GSM::Time gsmts;
union {
blade_sample_type burst[ONE_TS_BURST_LEN];
- char sch_bits[148];
+ sbit_t sch_bits[148];
};
};

diff --git a/Transceiver52M/ms/ms_rx_lower.cpp b/Transceiver52M/ms/ms_rx_lower.cpp
index d894e96..1cc3ffb 100644
--- a/Transceiver52M/ms/ms_rx_lower.cpp
+++ b/Transceiver52M/ms/ms_rx_lower.cpp
@@ -34,6 +34,8 @@

extern "C" {
#include "sch.h"
+
+#include <osmocom/core/bits.h>
}

#ifdef LOG
@@ -123,7 +125,7 @@
gain_check = (gain_check + 1) % avgburst_num;
}

-static char sch_demod_bits[148];
+static sbit_t sch_demod_bits[148];

bool ms_trx::handle_sch_or_nb()
{
@@ -174,7 +176,7 @@
}
detect_burst_nb(&ss[start], &channel_imp_resp[0], 0, sch_demod_bits);

- auto sch_decode_success = decode_sch(sch_demod_bits, is_first_sch_acq);
+ auto sch_decode_success = decode_sch((char *)sch_demod_bits, is_first_sch_acq);
#if 0
auto burst = new signalVector(buf_len, 50);
const auto corr_type = is_first_sch_acq ? sch_detect_type::SCH_DETECT_BUFFER : sch_detect_type::SCH_DETECT_FULL;
diff --git a/Transceiver52M/ms/ms_upper.h b/Transceiver52M/ms/ms_upper.h
index 06f7c54..c35a67c 100644
--- a/Transceiver52M/ms/ms_upper.h
+++ b/Transceiver52M/ms/ms_upper.h
@@ -26,9 +26,13 @@
#include "GSMCommon.h"
#include "ms.h"

+extern "C" {
+#include <osmocom/core/bits.h>
+}
+
class upper_trx : public ms_trx {
volatile bool mOn;
- char demodded_softbits[444];
+ sbit_t demodded_softbits[444];

// void driveControl();
bool pullRadioVector(GSM::Time &wTime, int &RSSI, int &timingOffset);
diff --git a/utils/va-test/burst-gen.cpp b/utils/va-test/burst-gen.cpp
index bdd0c4b..ee3b1f7 100644
--- a/utils/va-test/burst-gen.cpp
+++ b/utils/va-test/burst-gen.cpp
@@ -27,6 +27,7 @@
extern "C" {
#include "convert.h"
#include <convolve.h>
+#include <osmocom/core/bits.h>
}

#define _CRT_SECURE_NO_WARNINGS
@@ -291,7 +292,7 @@
std::cerr << "demod test va:" << std::endl;
std::complex<float> chan_imp_resp[CHAN_IMP_RESP_LENGTH * d_OSR];
float ncmax;
- char demodded_softbits[444];
+ sbit_t demodded_softbits[444];

// demod at known offset
{
@@ -376,7 +377,7 @@
if (rs.ct == CorrType::RACH) {
std::complex<float> chan_imp_resp[CHAN_IMP_RESP_LENGTH * d_OSR];
float ncmax;
- char demodded_softbits[444];
+ sbit_t demodded_softbits[444];
int normal_burst_start = 0;
normal_burst_start = get_access_imp_resp(conved_beg, &chan_imp_resp[0], &ncmax, 0);
normal_burst_start = std::max(normal_burst_start, 0);
@@ -414,7 +415,7 @@
} else {
std::complex<float> chan_imp_resp[CHAN_IMP_RESP_LENGTH * d_OSR];
float ncmax;
- char demodded_softbits[444];
+ sbit_t demodded_softbits[444];

auto normal_burst_start = get_norm_chan_imp_resp(conved_beg, &chan_imp_resp[0], &ncmax, tsc);
detect_burst_nb(conved_beg, &chan_imp_resp[0], normal_burst_start + 0, demodded_softbits);
@@ -431,7 +432,7 @@
}

struct estim_burst_params ebp;
- char demodded_softbits[444];
+ sbit_t demodded_softbits[444];
complex *rx_sigproc_cfloat = reinterpret_cast<complex *>(conved_beg);
signalVector sv(rx_sigproc_cfloat, 0, rs.convolved->size(), dummy_alloc, dummy_free);


To view, visit change 42822. To unsubscribe, or for help writing mail filters, visit settings.

Gerrit-MessageType: merged
Gerrit-Project: osmo-trx
Gerrit-Branch: master
Gerrit-Change-Id: I1cda66228f3d48e1b941b25614d599c16ad79aa0
Gerrit-Change-Number: 42822
Gerrit-PatchSet: 2
Gerrit-Owner: manawyrm <osmocom.account@tbspace.de>
Gerrit-Reviewer: Hoernchen <ewild@sysmocom.de>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: fixeria <vyanitskiy@sysmocom.de>
Gerrit-Reviewer: laforge <laforge@osmocom.org>
Gerrit-Reviewer: manawyrm <osmocom.account@tbspace.de>
Gerrit-Reviewer: pespin <pespin@sysmocom.de>