FreeCalypso > hg > freecalypso-sw
annotate gsm-fw/gpf/osl/os_sem_ir.c @ 923:10b4bed10192
gsm-fw/L1: fix for the DSP patch corruption bug
The L1 code we got from the LoCosto fw contains a feature for DSP CPU load
measurement. This feature is a LoCosto-ism, i.e., not applicable to earlier
DBB chips (Calypso) with their respective earlier DSP ROMs. Most of the
code dealing with that feature is conditionalized as #if (DSP >= 38),
but one spot was missed, and the MCU code was writing into an API word
dealing with this feature. In TCS211 this DSP API word happens to be
used by the DSP code patch, hence that write was corrupting the patched
DSP code.
author | Mychaela Falconia <falcon@ivan.Harhan.ORG> |
---|---|
date | Mon, 19 Oct 2015 17:13:56 +0000 |
parents | d2b93cfe8e4c |
children |
rev | line source |
---|---|
450
8768b9f28073
OSL: os_sem_ir.c started
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
1 /* |
8768b9f28073
OSL: os_sem_ir.c started
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
2 * This C module is a reconstruction based on the disassembly of |
8768b9f28073
OSL: os_sem_ir.c started
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
3 * os_sem.obj in frame_na7_db_ir.lib from the Leonardo package. |
8768b9f28073
OSL: os_sem_ir.c started
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
4 */ |
8768b9f28073
OSL: os_sem_ir.c started
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
5 |
8768b9f28073
OSL: os_sem_ir.c started
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
6 /* set of included headers from COFF symtab: */ |
8768b9f28073
OSL: os_sem_ir.c started
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
7 #include <stdio.h> |
8768b9f28073
OSL: os_sem_ir.c started
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
8 #include <string.h> |
8768b9f28073
OSL: os_sem_ir.c started
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
9 #include "gpfconf.h" /* FreeCalypso addition */ |
8768b9f28073
OSL: os_sem_ir.c started
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
10 #include "../../nucleus/nucleus.h" |
8768b9f28073
OSL: os_sem_ir.c started
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
11 #include "typedefs.h" |
8768b9f28073
OSL: os_sem_ir.c started
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
12 #include "os.h" |
8768b9f28073
OSL: os_sem_ir.c started
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
13 #include "gdi.h" |
8768b9f28073
OSL: os_sem_ir.c started
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
14 #include "os_types.h" |
8768b9f28073
OSL: os_sem_ir.c started
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
15 #include "os_glob.h" |
8768b9f28073
OSL: os_sem_ir.c started
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
16 |
8768b9f28073
OSL: os_sem_ir.c started
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
17 extern T_OS_SEM_TABLE_ENTRY SemTable[]; |
8768b9f28073
OSL: os_sem_ir.c started
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
18 extern unsigned os_time_to_tick_multiplier; |
8768b9f28073
OSL: os_sem_ir.c started
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
19 |
8768b9f28073
OSL: os_sem_ir.c started
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
20 int |
8768b9f28073
OSL: os_sem_ir.c started
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
21 ReleaseSemaphoreCB(NU_SEMAPHORE *SemCB) |
8768b9f28073
OSL: os_sem_ir.c started
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
22 { |
8768b9f28073
OSL: os_sem_ir.c started
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
23 if (NU_Release_Semaphore(SemCB) == NU_SUCCESS) |
8768b9f28073
OSL: os_sem_ir.c started
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
24 return(OS_OK); |
8768b9f28073
OSL: os_sem_ir.c started
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
25 else |
8768b9f28073
OSL: os_sem_ir.c started
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
26 return(OS_ERROR); |
8768b9f28073
OSL: os_sem_ir.c started
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
27 } |
8768b9f28073
OSL: os_sem_ir.c started
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
28 |
451
578ba9dfc369
os_sem_ir.c: os_ReleaseSemaphore() done
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
450
diff
changeset
|
29 GLOBAL LONG |
578ba9dfc369
os_sem_ir.c: os_ReleaseSemaphore() done
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
450
diff
changeset
|
30 os_ReleaseSemaphore(OS_HANDLE TaskHandle, OS_HANDLE SemHandle) |
578ba9dfc369
os_sem_ir.c: os_ReleaseSemaphore() done
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
450
diff
changeset
|
31 { |
578ba9dfc369
os_sem_ir.c: os_ReleaseSemaphore() done
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
450
diff
changeset
|
32 if (NU_Release_Semaphore(&SemTable[SemHandle].SemCB) == NU_SUCCESS) |
578ba9dfc369
os_sem_ir.c: os_ReleaseSemaphore() done
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
450
diff
changeset
|
33 return(OS_OK); |
578ba9dfc369
os_sem_ir.c: os_ReleaseSemaphore() done
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
450
diff
changeset
|
34 else |
578ba9dfc369
os_sem_ir.c: os_ReleaseSemaphore() done
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
450
diff
changeset
|
35 return(OS_ERROR); |
578ba9dfc369
os_sem_ir.c: os_ReleaseSemaphore() done
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
450
diff
changeset
|
36 } |
578ba9dfc369
os_sem_ir.c: os_ReleaseSemaphore() done
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
450
diff
changeset
|
37 |
450
8768b9f28073
OSL: os_sem_ir.c started
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
38 int |
8768b9f28073
OSL: os_sem_ir.c started
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
39 ObtainSemaphoreCB(NU_SEMAPHORE *SemCB, ULONG Timeout, USHORT wait_check) |
8768b9f28073
OSL: os_sem_ir.c started
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
40 { |
452
d461c532c76d
os_sem_ir.c: ObtainSemaphoreCB() done
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
451
diff
changeset
|
41 UNSIGNED nu_timeout; |
d461c532c76d
os_sem_ir.c: ObtainSemaphoreCB() done
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
451
diff
changeset
|
42 STATUS sts; |
d461c532c76d
os_sem_ir.c: ObtainSemaphoreCB() done
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
451
diff
changeset
|
43 int ret; |
450
8768b9f28073
OSL: os_sem_ir.c started
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
44 |
452
d461c532c76d
os_sem_ir.c: ObtainSemaphoreCB() done
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
451
diff
changeset
|
45 ret = OS_OK; |
d461c532c76d
os_sem_ir.c: ObtainSemaphoreCB() done
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
451
diff
changeset
|
46 if (Timeout != OS_SUSPEND) |
d461c532c76d
os_sem_ir.c: ObtainSemaphoreCB() done
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
451
diff
changeset
|
47 nu_timeout = TIME_TO_SYSTEM_TICKS(Timeout); |
d461c532c76d
os_sem_ir.c: ObtainSemaphoreCB() done
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
451
diff
changeset
|
48 else if (wait_check == 1) |
d461c532c76d
os_sem_ir.c: ObtainSemaphoreCB() done
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
451
diff
changeset
|
49 nu_timeout = 1; |
d461c532c76d
os_sem_ir.c: ObtainSemaphoreCB() done
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
451
diff
changeset
|
50 else |
d461c532c76d
os_sem_ir.c: ObtainSemaphoreCB() done
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
451
diff
changeset
|
51 nu_timeout = NU_SUSPEND; |
d461c532c76d
os_sem_ir.c: ObtainSemaphoreCB() done
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
451
diff
changeset
|
52 for (;;) { |
d461c532c76d
os_sem_ir.c: ObtainSemaphoreCB() done
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
451
diff
changeset
|
53 sts = NU_Obtain_Semaphore(SemCB, nu_timeout); |
d461c532c76d
os_sem_ir.c: ObtainSemaphoreCB() done
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
451
diff
changeset
|
54 switch (sts) { |
d461c532c76d
os_sem_ir.c: ObtainSemaphoreCB() done
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
451
diff
changeset
|
55 case NU_SUCCESS: |
d461c532c76d
os_sem_ir.c: ObtainSemaphoreCB() done
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
451
diff
changeset
|
56 return(ret); |
d461c532c76d
os_sem_ir.c: ObtainSemaphoreCB() done
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
451
diff
changeset
|
57 case NU_INVALID_SEMAPHORE: |
d461c532c76d
os_sem_ir.c: ObtainSemaphoreCB() done
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
451
diff
changeset
|
58 return(OS_ERROR); |
d461c532c76d
os_sem_ir.c: ObtainSemaphoreCB() done
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
451
diff
changeset
|
59 case NU_INVALID_SUSPEND: |
d461c532c76d
os_sem_ir.c: ObtainSemaphoreCB() done
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
451
diff
changeset
|
60 nu_timeout = 0; |
d461c532c76d
os_sem_ir.c: ObtainSemaphoreCB() done
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
451
diff
changeset
|
61 continue; |
d461c532c76d
os_sem_ir.c: ObtainSemaphoreCB() done
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
451
diff
changeset
|
62 case NU_TIMEOUT: |
d461c532c76d
os_sem_ir.c: ObtainSemaphoreCB() done
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
451
diff
changeset
|
63 case NU_UNAVAILABLE: |
d461c532c76d
os_sem_ir.c: ObtainSemaphoreCB() done
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
451
diff
changeset
|
64 if (nu_timeout == 1 && wait_check == 1) { |
d461c532c76d
os_sem_ir.c: ObtainSemaphoreCB() done
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
451
diff
changeset
|
65 nu_timeout = NU_SUSPEND; |
d461c532c76d
os_sem_ir.c: ObtainSemaphoreCB() done
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
451
diff
changeset
|
66 ret = OS_WAITED; |
d461c532c76d
os_sem_ir.c: ObtainSemaphoreCB() done
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
451
diff
changeset
|
67 continue; |
d461c532c76d
os_sem_ir.c: ObtainSemaphoreCB() done
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
451
diff
changeset
|
68 } |
d461c532c76d
os_sem_ir.c: ObtainSemaphoreCB() done
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
451
diff
changeset
|
69 return(OS_TIMEOUT); |
d461c532c76d
os_sem_ir.c: ObtainSemaphoreCB() done
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
451
diff
changeset
|
70 default: |
d461c532c76d
os_sem_ir.c: ObtainSemaphoreCB() done
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
451
diff
changeset
|
71 /* |
d461c532c76d
os_sem_ir.c: ObtainSemaphoreCB() done
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
451
diff
changeset
|
72 * Disassembly reveals that the original code |
d461c532c76d
os_sem_ir.c: ObtainSemaphoreCB() done
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
451
diff
changeset
|
73 * has an endless loop here, the equivalent |
d461c532c76d
os_sem_ir.c: ObtainSemaphoreCB() done
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
451
diff
changeset
|
74 * of continue. My guess is that they simply |
d461c532c76d
os_sem_ir.c: ObtainSemaphoreCB() done
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
451
diff
changeset
|
75 * forgot the default case, and so control |
d461c532c76d
os_sem_ir.c: ObtainSemaphoreCB() done
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
451
diff
changeset
|
76 * falls onto the closing brace of the switch |
d461c532c76d
os_sem_ir.c: ObtainSemaphoreCB() done
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
451
diff
changeset
|
77 * and then onto the closing brace of the for |
d461c532c76d
os_sem_ir.c: ObtainSemaphoreCB() done
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
451
diff
changeset
|
78 * loop. But I prefer better error handling, |
d461c532c76d
os_sem_ir.c: ObtainSemaphoreCB() done
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
451
diff
changeset
|
79 * hence the present addition. - Space Falcon |
d461c532c76d
os_sem_ir.c: ObtainSemaphoreCB() done
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
451
diff
changeset
|
80 */ |
d461c532c76d
os_sem_ir.c: ObtainSemaphoreCB() done
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
451
diff
changeset
|
81 return(OS_ERROR); |
d461c532c76d
os_sem_ir.c: ObtainSemaphoreCB() done
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
451
diff
changeset
|
82 } |
d461c532c76d
os_sem_ir.c: ObtainSemaphoreCB() done
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
451
diff
changeset
|
83 } |
450
8768b9f28073
OSL: os_sem_ir.c started
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
84 } |
453
d2b93cfe8e4c
OSL: os_sem_ir.c done
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
452
diff
changeset
|
85 |
d2b93cfe8e4c
OSL: os_sem_ir.c done
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
452
diff
changeset
|
86 GLOBAL LONG |
d2b93cfe8e4c
OSL: os_sem_ir.c done
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
452
diff
changeset
|
87 os_ObtainSemaphore(OS_HANDLE TaskHandle, OS_HANDLE SemHandle, ULONG Timeout) |
d2b93cfe8e4c
OSL: os_sem_ir.c done
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
452
diff
changeset
|
88 { |
d2b93cfe8e4c
OSL: os_sem_ir.c done
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
452
diff
changeset
|
89 if (SemHandle > MaxSemaphores) |
d2b93cfe8e4c
OSL: os_sem_ir.c done
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
452
diff
changeset
|
90 return(OS_ERROR); |
d2b93cfe8e4c
OSL: os_sem_ir.c done
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
452
diff
changeset
|
91 return ObtainSemaphoreCB(&SemTable[SemHandle].SemCB, Timeout, 0); |
d2b93cfe8e4c
OSL: os_sem_ir.c done
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
452
diff
changeset
|
92 } |