2014-09-11 9 views
5

Ho un enorme codice sorgente che funziona su PowerPC. Ho bisogno di portarlo su ARM. Ma, ARM genera un'eccezione h/w sugli accessi di memoria non allineati. Quindi, voglio trovare tutte le possibili istanze in cui potrebbe verificarsi l'eccezione di accesso alla memoria non allineato. Ho preso in considerazione le seguenti opzioni.Genera un'eccezione di accesso alla memoria non allineata in PowerPC

  1. Utilizzare -Wcast-align in gcc che genera avvisi per l'accesso non allineato.
  2. Fare in modo che il PowerPC generi un'eccezione non allineata. Per ARM, c'è un'opzione/proc/cpu/alignment con la quale l'utente può decidere come gestire l'eccezione. Ma, non esiste una tale opzione per PowerPC.

Le mie domande sono,

  1. C'è un modo per rendere il PowerPC generare un'eccezione di accesso alla memoria non allineati?
  2. C'è un modo migliore per scoprire tutte le occorrenze di accesso alla memoria non allineato nel codice sorgente?
+0

modo per fare in modo che il PowerPC generi un'eccezione di accesso alla memoria non allineata: alcune opzioni nel kernel (CONFIG_ALIGNMENT_TRAP, ecc.)? – someuser

+0

Inoltre puoi semplicemente portarlo, catturarlo e sistemarlo. :) – someuser

+0

PowerPC genera sempre eccezioni di allineamento, ad eccezione dei carichi/negozi AltiVec. Ovviamente il tuo sistema operativo può gestire silenziosamente queste eccezioni, ma questa è un'altra storia. –

risposta

2
  1. Dipende dal vostro processore PowerPC. Processori di server di fascia alta come POWER8 non generano quasi mai eccezioni di allineamento. Detto questo, spesso esiste un bit HID SPR per rendere più frequenti le eccezioni di allineamento. Ad ogni modo, sotto Linux, il kernel li gestirà e l'utente non lo vedrà, a parte una perdita di prestazioni. È possibile impostare il prctl (PR_UNALIGN_SIGBUS) e questo renderà il kernel generare un SIGBUS, piuttosto che gestirli.

  2. In Linux con eventi perf è possibile utilizzare gli eventi di allineamento-guasti. es. "perf stat -e allineamento-errori testcase". Inoltre se attivi CONFIG_PPC_EMULATED_STATS otterrai una voce debugfs chiamata "emulated_instructions" che ha una voce per gli accessi non allineati.

+0

Invece di fare tutto questo, non è meglio compilare usando -Wcast-align e correggere tutti i problemi? – linuxfreak

+0

Sì, è meglio evitare questi quando possibile. A volte però non è possibile e potresti voler controllare. –

2
  1. Sì e no. L'hardware PowerPC ha un accesso non allineato a 32 bit nell'hardware, che non può essere sovrascritto facilmente. Ma se si esegue "bare metal" invece che sotto un sistema operativo, è possibile forzarlo a generare un'eccezione mappando un'area di memoria come spazio I/O. Tuttavia, questo approccio è complicato e probabilmente faresti meglio a rivedere il codice a mano.

    Per gli accessi a 64 bit, la maggior parte dei PowerPC genera già eccezioni su un accesso non allineato, se questo è il caso dell'hardware che è possibile intercettare. Anche in questo caso ciò deve accadere nel kernel, quindi se stai usando un sistema operativo non puoi farlo facilmente (il kernel gestirà quindi l'accesso non allineato nel software senza dirlo a riguardo).

  2. Non proprio, questo può essere determinato solo in fase di esecuzione, specialmente se si sta eseguendo molto aritmetica dei puntatori.

+0

1) Lo sto eseguendo su OS e non su "bare metal". È possibile creare la voce/proc/cpu/alignment e gestire l'eccezione nel kernel? 2) Sembra che non ci sia altro modo per farlo in fase di esecuzione. Quindi, possiamo usare uno strumento analizzatore statico per scoprire tutte le istanze? – linuxfreak

+2

È sempre possibile gestire questo tipo di eccezione nel kernel, emulando l'accesso non riuscito. Questo è come è fatto anche su MIPS. Ma c'è una pesante penalità di prestazioni, quindi l'approccio migliore è quello di eliminare il maggior numero possibile dal codice sorgente e avere l'emulazione come back-stop. È possibile avere un contatore per gli accessi non allineati esposti in/proc fs, e si potrebbe anche registrare gli indirizzi in cui si verificano gli accessi e quindi correggerli in modo retrospettivo nel codice sorgente. Non sono a conoscenza di alcuno strumento di analisi statica in grado di catturare tutti questi elementi, e non credo sia possibile fare il 100%. – ThomasH

Problemi correlati