| Index: embios/trunk/target/ipodnano2g/clockgates.c | 
| — | — | @@ -27,6 +27,8 @@ | 
| 28 | 28 |  | 
| 29 | 29 | void clockgate_enable(int gate, bool enable) | 
| 30 | 30 | { | 
|  | 31 | +    uint32_t mode = enter_critical_section(); | 
| 31 | 32 | if (enable) PWRCON(gate >> 5) &= ~(1 << (gate & 0x1f)); | 
| 32 | 33 | else PWRCON(gate >> 5) |= 1 << (gate & 0x1f); | 
|  | 34 | +    leave_critical_section(mode); | 
| 33 | 35 | } | 
| Index: embios/trunk/target/ipodnano2g/hwkeyaes.c | 
| — | — | @@ -27,10 +27,14 @@ | 
| 28 | 28 | #include "thread.h" | 
| 29 | 29 |  | 
| 30 | 30 |  | 
|  | 31 | +struct mutex hwkeyaes_mutex; | 
|  | 32 | + | 
|  | 33 | + | 
| 31 | 34 | void hwkeyaes(enum hwkeyaes_direction direction, uint32_t keyidx, void* data, uint32_t size) | 
| 32 | 35 | { | 
| 33 | 36 | uint32_t ptr, i; | 
| 34 | 37 | uint32_t go = 1; | 
|  | 38 | +    mutex_lock(&hwkeyaes_mutex, TIMEOUT_BLOCK); | 
| 35 | 39 | PWRCON(1) &= ~0x400; | 
| 36 | 40 | AESTYPE = keyidx; | 
| 37 | 41 | AESUNKREG0 = 1; | 
| — | — | @@ -70,4 +74,5 @@ | 
| 71 | 75 | } | 
| 72 | 76 | AESCONTROL = 0; | 
| 73 | 77 | PWRCON(1) |= 0x400; | 
|  | 78 | +    mutex_unlock(&hwkeyaes_mutex); | 
| 74 | 79 | } | 
| Index: embios/trunk/target/ipodnano2g/hmacsha1.c | 
| — | — | @@ -27,10 +27,14 @@ | 
| 28 | 28 | #include "thread.h" | 
| 29 | 29 |  | 
| 30 | 30 |  | 
|  | 31 | +struct mutex hmacsha1_mutex; | 
|  | 32 | + | 
|  | 33 | + | 
| 31 | 34 | void hmacsha1(void* data, uint32_t size, void* result) | 
| 32 | 35 | { | 
| 33 | 36 | uint32_t ptr, i; | 
| 34 | 37 | uint32_t ctrl = 2; | 
|  | 38 | +    mutex_lock(&hmacsha1_mutex, TIMEOUT_BLOCK); | 
| 35 | 39 | PWRCON(1) &= ~4; | 
| 36 | 40 | for (ptr = 0; ptr < (size >> 2); ptr += 0x10) | 
| 37 | 41 | { | 
| — | — | @@ -41,4 +45,5 @@ | 
| 42 | 46 | } | 
| 43 | 47 | for (i = 0; i < 5; i ++) ((uint32_t*)result)[i] = HASHRESULT[i]; | 
| 44 | 48 | PWRCON(1) |= 4; | 
|  | 49 | +    mutex_unlock(&hmacsha1_mutex); | 
| 45 | 50 | } | 
| Index: embios/trunk/target/ipodnano2g/interrupt.c | 
| — | — | @@ -132,8 +132,10 @@ | 
| 133 | 133 |  | 
| 134 | 134 | void interrupt_enable(int irq, bool state) | 
| 135 | 135 | { | 
|  | 136 | +    uint32_t mode = enter_critical_section(); | 
| 136 | 137 | if (state) INTMSK |= 1 << irq; | 
| 137 | 138 | else INTMSK &= ~(1 << irq); | 
|  | 139 | +    leave_critical_section(mode); | 
| 138 | 140 | } | 
| 139 | 141 |  | 
| 140 | 142 | void interrupt_set_handler(int irq, void* handler) | 
| Index: embios/trunk/target/ipodnano3g/clockgates.c | 
| — | — | @@ -27,6 +27,8 @@ | 
| 28 | 28 |  | 
| 29 | 29 | void clockgate_enable(int gate, bool enable) | 
| 30 | 30 | { | 
|  | 31 | +    uint32_t mode = enter_critical_section(); | 
| 31 | 32 | if (enable) PWRCON(gate >> 5) &= ~(1 << (gate & 0x1f)); | 
| 32 | 33 | else PWRCON(gate >> 5) |= 1 << (gate & 0x1f); | 
|  | 34 | +    leave_critical_section(mode); | 
| 33 | 35 | } | 
| Index: embios/trunk/target/ipodnano3g/hwkeyaes.c | 
| — | — | @@ -27,9 +27,13 @@ | 
| 28 | 28 | #include "thread.h" | 
| 29 | 29 |  | 
| 30 | 30 |  | 
|  | 31 | +struct mutex hwkeyaes_mutex; | 
|  | 32 | + | 
|  | 33 | + | 
| 31 | 34 | void hwkeyaes(enum hwkeyaes_direction direction, uint32_t keyidx, void* data, uint32_t size) | 
| 32 | 35 | { | 
| 33 | 36 | int i; | 
|  | 37 | +    mutex_lock(&hwkeyaes_mutex, TIMEOUT_BLOCK); | 
| 34 | 38 | clockgate_enable(10, true); | 
| 35 | 39 | for (i = 0; i < 4; i++) AESIV[i] = 0; | 
| 36 | 40 | AESUNKREG0 = 1; | 
| — | — | @@ -52,4 +56,5 @@ | 
| 53 | 57 | invalidate_dcache(); | 
| 54 | 58 | while (!(AESSTATUS & 0xf)) sleep(100); | 
| 55 | 59 | clockgate_enable(10, false); | 
|  | 60 | +    mutex_unlock(&hwkeyaes_mutex); | 
| 56 | 61 | } |