Ho analizzato un pò il problema e grazie ad un amico (il mio guru personale SKAMAN ) sono venuto un pò a capo della cosa.
Vediamo alcuni punti fermi di __umoddi3 e __divdi3
1) il problema si verifica quando si tenta di eseguire una divisione "/" o modulo "%" su un "long long int" (64 bit). Se hai una cpu+os a 64 bit, nessun problema: la esegue la CPU direttamente. Ma se hai un S.O. a 32 bit (o altro come nel mio caso, cpu BRCM), per eseguire questa operazione è necessario avere accesso ad una specifica funzione delle libc. Nessun problema normalmente TRANNE che in ambito kernel non puoi linkare le libc .... Quindi le funzioni non sono disponibili e da qui l'errore.
2) i tuoi sorgenti 2.2.1 sono parecchio pasticciati nel senso che vedo molte definizioni di tipo sono cambiate senza ragione.
s32 al posto di int, s64 al posto di unsigned long.... insomma potrebbero verificarsi grossi casini.
Un u64 è 64 bit, un unsigned long può essere 32 o 64 bit .... ma sotto linux un long e long long "dovrebbero" essere sempre uguali e pari a 64 bit a meno che non sia cambiato qualcosa.
Per esserne sicuri basta fare un microprogramma che printi il sizeof() delle variabili e vedere che succede con sizeof(int), sizeof(long), sizeof(long long),
Questo va letto per cultura:
http://www.ibm.com/developerworks/libra ... index.html
Si può procedere in due modi:
a) usando
Si va a vedere quali sono i *.o che contengono __umoddi3 e __divdi3 e si corregge il tiro andando a modificare le operazioni "/" e "%" laddove vengano usati i "long long int" cambiando typecast a 32 bit (se possibile) oppure usando do_div() in modo da fare eseguire l'operazione dentro il kernel e non usando operazioni "esterne"
Meno preciso di gdb ma più veloce. Non sai esattamente in quale riga c'e' il problema ma almeno trovi i files incriminati.
b) (io la preferisco) ripartire da una situazione di cast pulita, ossia prendendo i sorgenti 2.2.0, modificando quelle poche cose per compilarli sotto kernel 3.3.0 (non sono molte) e da qui se i problemi ci sono ancora , allora procedere come al punto (a)