From: bin4ry <0xbin4ry@gmail.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] Unexpected effects/problems porting code to u-boot SPL
Date: Wed, 28 Aug 2013 15:30:31 +0200 [thread overview]
Message-ID: <521DFB77.4050401@gmail.com> (raw)
I want to extend the u-boot SPL code with some fuzzy extractor logic by
adding code into
`{u-boot_sources}/arch/arm/cpu/armv7/omap-common/hwinit-common.c`.
U-boot shall be used on a PandaBoard ES (omap4460 SoC).
Thus, first I successfully implemented the code on my x86 pc and I am
porting it to the ARM-based PandaBoard. The complete code can be found
here (as a side note the "main" function is s_init()):
http://pastebin.com/iaz13Yn9
However, I am expecting dozens of unexptected effects, which results in
either stopping during the execution of the code, stopping u-boot after
reading u-boot.img or not sending output (and thus not booting) at all.
For example, I want to call two functions (`computeSyndrome`,
`decodeErrors`) inside a `for`-loop, which is part of another function
`golayDecode`.
For my first problem please ignore the code below the multiline comment
starting with `/* >>>> These lines of code below totally break
u-boot`. Also only the function `computeSyndrome` in conjunction with
the calling function `golayDecode` is important.
The issue: If comment out both functions `computeSyndrome` and
`decodeErrors` everything works fine and the OS (Android) is booting.
However, if `computeSyndrome` is not commented out and thus gets
processed, u-boot stucks after displaying `reading u-boot.img`.
The funny thing about it: even if I replace `computeSyndrome` with a
bogus function which does not but iterating a values or displaying
stuff, u-boot stucks as well.
Furthermore, if I remove the multiline comment furhter below to also
include the residual code, u-boot doesn't display ony character. *
I am a beginner regarding microprocessor programming but I can not
figure out a possible error in these 12 lines of the computeSyndrome
function or the general behaviour of u-boot at all. **
Does anyone have a clue what I am missing?
Thanks,
P.
* I am using minicom to display the output of u-boot, which I receive
over serial-usb-converter.
** I am using the following compiler flags to make sure there are no
errors at compile time: `-Wall -Wstrict-prototypes
-Wdisabled-optimization -W -pedantic`
void golayDecode(volatile int x[12], volatile int y[12], volatile
unsigned int golayEncodedSecret[30], volatile unsigned int s, volatile
unsigned char repetitionDecodedSecretBits[360]){
printf("\n[I] - Performing Golay decoding\r\n");
volatile unsigned char secret[22] = {0};
volatile unsigned char currentByte = 0, tmpByte = 0;
volatile unsigned int golayDecodedSecret[30] ={0};
volatile int twelveBitCounter = 0;//, j = 0, k = 0, q = 0, aux = 0,
found = 0, bitCounter = 0, i_2 = 7, currentSecretEncByte = 0x00;
volatile int c_hat[2] = {0}, e[2] = {0};
e[0] = s;
e[1] = 0;
for(twelveBitCounter = 0; twelveBitCounter < 30; twelveBitCounter+=2){
printf("Computing syndrome and decoding errors for bytes %03x &
%03x\n", golayEncodedSecret[twelveBitCounter],
golayEncodedSecret[twelveBitCounter+1]);
computeSyndrome(golayEncodedSecret[twelveBitCounter],
golayEncodedSecret[twelveBitCounter+1], x, y, s);
decodeErrors(golayEncodedSecret[i], golayEncodedSecret[i+1],
x, y, s);
}
printf("\n[D] - Reconstructing secret bytes\r\n");
/* >>>> These lines of code below totally break u-boot
for(i = 0; i < 30; i+=2){
currentSecretEncByte = golayDecodedSecret[i];
volatile int j = 11;
// Access each source bit
for(; 0<=j; j--){
volatile int currentSourceBit = (currentSecretEncByte >> j)
& 0x01;
repetitionDecodedSecretBits[bitCounter] = currentSourceBit;
bitCounter++;
}
}
k = 0;
for(i = 0; i<176; i++){
tmpByte = repetitionDecodedSecretBits[i] << i_2;
currentByte = currentByte | tmpByte;
i_2--;
if(i_2==0){ // We collected 8 bits and created a byte
secret[k] = currentByte;
i_2 = 7;
tmpByte = 0x00;
currentByte = 0x00;
k++;
}
}
SHA256_CTX ctx;
unsigned char hash[32];
printf("\n[I] - Generating secret key K\n");
sha256_init(&ctx);
sha256_update(&ctx,secret,strlen((const char*)secret));
sha256_final(&ctx,hash);
printf("\n[I] - This is our secret key
K\n\t==================================\n\t");
print_hash(hash);
printf("\t==================================\n");
*/
}
/* Function for syndrome computation */
void computeSyndrome(int r0, int r1, volatile int x[12], volatile
int y[12], volatile unsigned int s){
unsigned int syndromeBitCounter, syndromeMatrixCounter, syndromeAux;
s = 0;
for(syndromeMatrixCounter=0; syndromeMatrixCounter<12;
syndromeMatrixCounter++){
syndromeAux = 0;
for(syndromeBitCounter=0; syndromeBitCounter<12;
syndromeBitCounter++){
syndromeAux =
syndromeAux^((x[syndromeMatrixCounter]&r0)>>syndromeBitCounter &0x01);
}
for(syndromeBitCounter=0; syndromeBitCounter<12;
syndromeBitCounter++){
syndromeAux =
syndromeAux^((y[syndromeMatrixCounter]&r1)>>syndromeBitCounter &0x01);
}
s = (s<<1)^syndromeAux;
}
}
/* Funcion to recover original byte */
void decodeErrors(int r0, int r1, volatile int x[12], volatile int
y[12], volatile unsigned int s){
//printf("\n[D] - Starting to decode errors for %3x | %3x\n", r0, r1);
volatile unsigned int c_hat[2] = {0xaa}, e[2] = {0xaa};
volatile unsigned int q;
unsigned int i, j, aux, found;
//printf("Step 2\n");
if(weight(s)<=3){
e[0] = s;
e[1] = 0;
}else{
/******* STEP 3 */
//printf("Step 3\n");
i = 0;
found = 0;
do{
if (weight(s^y[i]) <=2){
e[0] = s^y[i];
e[1] = x[i];
found = 1;
printf("\ntest 2\n");
}
i++;
}while ((i<12) && (!found));
if (( i==12 ) && (!found)){
/******* STEP 4 */
//printf("Step 4\n");
q = 0;
for (j=0; j<12; j++){
aux = 0;
for (i=0; i<12; i++)
aux = aux ^ ( (y[j]&s)>>i & 0x01 );
q = (q<<1) ^ aux;
}
/******* STEP 5 */
//printf("Step 5\n");
if (weight(q) <=3){
e[0] = 0;
e[1] = q;
}else{
/******* STEP 6 */
//printf("Step 6\n");
i = 0;
found = 0;
do{
if (weight(q^y[i]) <=2){
e[0] = x[i];
e[1] = q^y[i];
found = 1;
}
i++;
}while((i<12) && (!found));
if ((i==12) && (!found)){
/******* STEP 7 */
printf("\n[E] - uncorrectable error pattern! (%3x
| %3x)\n", r0, r1);
/* You can raise a flag here, or output the
vector as is */
//exit(1);
}
}
}
}
c_hat[0] = r0^e[0];
c_hat[1] = r1^e[1];
//printf("\t\tEstimated codeword = %x%x\n", c_hat[0], c_hat[1]);
}
next reply other threads:[~2013-08-28 13:30 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-08-28 13:30 bin4ry [this message]
2013-08-28 14:58 ` [U-Boot] Unexpected effects/problems porting code to u-boot SPL Andreas Bießmann
[not found] ` <521E30B0.1070305@gmail.com>
2013-08-29 6:17 ` Andreas Bießmann
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=521DFB77.4050401@gmail.com \
--to=0xbin4ry@gmail.com \
--cc=u-boot@lists.denx.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.