mirror of
https://github.com/apache/nuttx.git
synced 2026-05-31 14:27:37 +08:00
ARMv7-A: Need 8-byte stack alignment when callign C code from interrupt handlers. This change needs to be ported to other ARM architectures as well
This commit is contained in:
@@ -5165,4 +5165,7 @@
|
|||||||
definitions for the SAMA5D3 (2013-7-23).
|
definitions for the SAMA5D3 (2013-7-23).
|
||||||
* arch/arm/src/sama5/chip/: New header files for SAMA5 AXI Matrix
|
* arch/arm/src/sama5/chip/: New header files for SAMA5 AXI Matrix
|
||||||
SFR, and BSC blocks (2013-7-23).
|
SFR, and BSC blocks (2013-7-23).
|
||||||
|
* arch/arm/src/armv7-a/arm_vectors.S: Force 8-byte stack alignment
|
||||||
|
in interrupt handlers before calling C code. Other ARM
|
||||||
|
architectures need to do this as well (2013-7-23).
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
NuttX TODO List (Last updated June 23, 2013)
|
NuttX TODO List (Last updated July 23, 2013)
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
This file summarizes known NuttX bugs, limitations, inconsistencies with
|
This file summarizes known NuttX bugs, limitations, inconsistencies with
|
||||||
standards, things that could be improved, and ideas for enhancements. See
|
standards, things that could be improved, and ideas for enhancements. See
|
||||||
also individual README.txt files in the configs/ sub-directories for each
|
also individual README.txt files in the configs/ sub-directories for each
|
||||||
board port.
|
board port.
|
||||||
@@ -24,7 +24,7 @@ nuttx/
|
|||||||
(1) Documentation (Documentation/)
|
(1) Documentation (Documentation/)
|
||||||
(6) Build system / Toolchains
|
(6) Build system / Toolchains
|
||||||
(5) Linux/Cywgin simulation (arch/sim)
|
(5) Linux/Cywgin simulation (arch/sim)
|
||||||
(4) ARM (arch/arm/)
|
(5) ARM (arch/arm/)
|
||||||
(1) ARM/C5471 (arch/arm/src/c5471/)
|
(1) ARM/C5471 (arch/arm/src/c5471/)
|
||||||
(3) ARM/DM320 (arch/arm/src/dm320/)
|
(3) ARM/DM320 (arch/arm/src/dm320/)
|
||||||
(2) ARM/i.MX (arch/arm/src/imx/)
|
(2) ARM/i.MX (arch/arm/src/imx/)
|
||||||
@@ -149,7 +149,7 @@ o Task/Scheduler (sched/)
|
|||||||
|
|
||||||
Title: ISSUES WITH atexit() AND on_exit()
|
Title: ISSUES WITH atexit() AND on_exit()
|
||||||
Description: These functions execute with the following bad properties:
|
Description: These functions execute with the following bad properties:
|
||||||
|
|
||||||
1. They run with interrupts disabled,
|
1. They run with interrupts disabled,
|
||||||
2. They run in supervisor mode (if applicable), and
|
2. They run in supervisor mode (if applicable), and
|
||||||
3. They do not obey any setup of PIC or address
|
3. They do not obey any setup of PIC or address
|
||||||
@@ -426,7 +426,7 @@ o Kernel Build
|
|||||||
the count becomes negative the caller must be blocked.
|
the count becomes negative the caller must be blocked.
|
||||||
|
|
||||||
Update:
|
Update:
|
||||||
"I am thinking that there should be a "magic" global, user-accessible
|
"I am thinking that there should be a "magic" global, user-accessible
|
||||||
variable that holds the PID of the currently executing thread;
|
variable that holds the PID of the currently executing thread;
|
||||||
basically the PID of the task at the head of the ready-to-run list.
|
basically the PID of the task at the head of the ready-to-run list.
|
||||||
This variable would have to be reset each time the head of the ready-
|
This variable would have to be reset each time the head of the ready-
|
||||||
@@ -474,10 +474,10 @@ o Kernel Build
|
|||||||
OS services within the kernel and with other OS facilities, such
|
OS services within the kernel and with other OS facilities, such
|
||||||
as the file system, message queues, etc., residing in user-space
|
as the file system, message queues, etc., residing in user-space
|
||||||
and to interfacing with those core OS facilities through traps.
|
and to interfacing with those core OS facilities through traps.
|
||||||
Status: Open
|
Status: Open
|
||||||
Priority: Low. This is a good idea and certainly an architectural
|
Priority: Low. This is a good idea and certainly an architectural
|
||||||
improvement. However, there is no strong motivivation now do
|
improvement. However, there is no strong motivivation now do
|
||||||
do that partitioning work.
|
do that partitioning work.
|
||||||
|
|
||||||
o C++ Support
|
o C++ Support
|
||||||
^^^^^^^^^^^
|
^^^^^^^^^^^
|
||||||
@@ -641,7 +641,7 @@ o Binary loaders (binfmt/)
|
|||||||
Priority: Medium-High
|
Priority: Medium-High
|
||||||
|
|
||||||
Title: READ-ONLY DATA IN RAM
|
Title: READ-ONLY DATA IN RAM
|
||||||
Description: At present, all .rodata must be put into RAM. There is a
|
Description: At present, all .rodata must be put into RAM. There is a
|
||||||
tentative design change that might allow .rodata to be placed
|
tentative design change that might allow .rodata to be placed
|
||||||
in FLASH (see Documentation/NuttXNxFlat.html).
|
in FLASH (see Documentation/NuttXNxFlat.html).
|
||||||
Status: Open
|
Status: Open
|
||||||
@@ -676,9 +676,9 @@ o Binary loaders (binfmt/)
|
|||||||
else
|
else
|
||||||
NXFLATLDSCRIPT=$(TOPDIR)/binfmt/libnxflat/gnu-nxflat-gotoff.ld
|
NXFLATLDSCRIPT=$(TOPDIR)/binfmt/libnxflat/gnu-nxflat-gotoff.ld
|
||||||
endif
|
endif
|
||||||
|
|
||||||
Then use
|
Then use
|
||||||
|
|
||||||
NXFLATLDFLAGS2 = $(NXFLATLDFLAGS1) -T"$(NXFLATLDSCRIPT)" -no-check-sections
|
NXFLATLDFLAGS2 = $(NXFLATLDFLAGS1) -T"$(NXFLATLDSCRIPT)" -no-check-sections
|
||||||
|
|
||||||
Status: Open
|
Status: Open
|
||||||
@@ -712,15 +712,15 @@ o Binary loaders (binfmt/)
|
|||||||
.word .LC4-(.LPIC5+4)
|
.word .LC4-(.LPIC5+4)
|
||||||
|
|
||||||
This is good and bad. This is good because it means that .rodata.str1.1 can now
|
This is good and bad. This is good because it means that .rodata.str1.1 can now
|
||||||
reside in FLASH with .text and can be accessed using PC-relative addressing.
|
reside in FLASH with .text and can be accessed using PC-relative addressing.
|
||||||
That can be accomplished by simply moving the .rodata from the .data section to
|
That can be accomplished by simply moving the .rodata from the .data section to
|
||||||
the .text section in the linker script. (The NXFLAT linker script is located at
|
the .text section in the linker script. (The NXFLAT linker script is located at
|
||||||
nuttx/binfmt/libnxflat/gnu-nxflat.ld).
|
nuttx/binfmt/libnxflat/gnu-nxflat.ld).
|
||||||
|
|
||||||
This is bad because a lot of stuff may get broken an a lot of test will need to
|
This is bad because a lot of stuff may get broken an a lot of test will need to
|
||||||
be done. One question that I have is does this apply to all kinds of .rodata?
|
be done. One question that I have is does this apply to all kinds of .rodata?
|
||||||
Or just to .rodata.str1.1?
|
Or just to .rodata.str1.1?
|
||||||
|
|
||||||
Status: Open. Many of the required changes are in place but, unfortunately, not enough
|
Status: Open. Many of the required changes are in place but, unfortunately, not enough
|
||||||
go be fully functional. I think all of the I-Space-to-I-Space fixes are in place.
|
go be fully functional. I think all of the I-Space-to-I-Space fixes are in place.
|
||||||
However, the generated code also includes PC-relative references to .bss which
|
However, the generated code also includes PC-relative references to .bss which
|
||||||
@@ -797,7 +797,7 @@ o Network (net/, drivers/net)
|
|||||||
Description: At present, there cannot be two concurrent active TCP send
|
Description: At present, there cannot be two concurrent active TCP send
|
||||||
operations in progress using the same socket. This is because
|
operations in progress using the same socket. This is because
|
||||||
the uIP ACK logic will support only one transfer at a time. The
|
the uIP ACK logic will support only one transfer at a time. The
|
||||||
solution is simple: A mutex will be needed to make sure that each
|
solution is simple: A mutex will be needed to make sure that each
|
||||||
send that is started is able to be the exclusive sender until all of
|
send that is started is able to be the exclusive sender until all of
|
||||||
the data to be sent has been ACKed.
|
the data to be sent has been ACKed.
|
||||||
Status: Open. There is some temporary logic to apps/nshlib that does
|
Status: Open. There is some temporary logic to apps/nshlib that does
|
||||||
@@ -1001,13 +1001,13 @@ o Libraries (libc/)
|
|||||||
Title: RESETTING GETOPT()
|
Title: RESETTING GETOPT()
|
||||||
Description: There is an issue with the way that getopt() handles errors that
|
Description: There is an issue with the way that getopt() handles errors that
|
||||||
return '?'.
|
return '?'.
|
||||||
|
|
||||||
1. Does getopt() reset its global variables after returning '?' so
|
1. Does getopt() reset its global variables after returning '?' so
|
||||||
that it can be re-used? That would be required to support where
|
that it can be re-used? That would be required to support where
|
||||||
the caller terminates parsing before reaching the last parameter.
|
the caller terminates parsing before reaching the last parameter.
|
||||||
2. Or is the client expected to continue parsing after getopt()
|
2. Or is the client expected to continue parsing after getopt()
|
||||||
returns '?' and parse until the final parameter?
|
returns '?' and parse until the final parameter?
|
||||||
|
|
||||||
The current getopt() implementation only supports #2.
|
The current getopt() implementation only supports #2.
|
||||||
Status: Open
|
Status: Open
|
||||||
Priority: Low
|
Priority: Low
|
||||||
@@ -1030,11 +1030,11 @@ o Libraries (libc/)
|
|||||||
ferror().
|
ferror().
|
||||||
|
|
||||||
Title: CONCURRENT STREAM READ/WRITE
|
Title: CONCURRENT STREAM READ/WRITE
|
||||||
Description: NuttX only supports a single file pointer so reads and writes
|
Description: NuttX only supports a single file pointer so reads and writes
|
||||||
must be from the same position. This prohibits implementation
|
must be from the same position. This prohibits implementation
|
||||||
of behavior like that required for fopen() with the "a+" mode.
|
of behavior like that required for fopen() with the "a+" mode.
|
||||||
According to the fopen man page:
|
According to the fopen man page:
|
||||||
|
|
||||||
"a+ Open for reading and appending (writing at end of file).
|
"a+ Open for reading and appending (writing at end of file).
|
||||||
The file is created if it does not exist. The initial file
|
The file is created if it does not exist. The initial file
|
||||||
position for reading is at the beginning of the file, but
|
position for reading is at the beginning of the file, but
|
||||||
@@ -1059,11 +1059,11 @@ o Libraries (libc/)
|
|||||||
by zero, since it will result in a compile-time diagnostic, if the
|
by zero, since it will result in a compile-time diagnostic, if the
|
||||||
implementation does not support infinity."
|
implementation does not support infinity."
|
||||||
Status: Open
|
Status: Open
|
||||||
Priority:
|
Priority:
|
||||||
|
|
||||||
Title: OLD dtoa NEEDS TO BE UPDATED
|
Title: OLD dtoa NEEDS TO BE UPDATED
|
||||||
Description: This implementation of dtoa in libc/stdio is old and will not
|
Description: This implementation of dtoa in libc/stdio is old and will not
|
||||||
work with some newer compilers. See
|
work with some newer compilers. See
|
||||||
http://patrakov.blogspot.com/2009/03/dont-use-old-dtoac.html
|
http://patrakov.blogspot.com/2009/03/dont-use-old-dtoac.html
|
||||||
Status: Open
|
Status: Open
|
||||||
Priority: ??
|
Priority: ??
|
||||||
@@ -1208,7 +1208,7 @@ o Graphics subystem (graphics/)
|
|||||||
Priority: Medium. Not important for day-to-day testing but would be
|
Priority: Medium. Not important for day-to-day testing but would be
|
||||||
a critical improvement if NxConsole were to be used in a
|
a critical improvement if NxConsole were to be used in a
|
||||||
product.
|
product.
|
||||||
|
|
||||||
o Pascal Add-On (pcode/)
|
o Pascal Add-On (pcode/)
|
||||||
^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
@@ -1350,7 +1350,7 @@ o Linux/Cywgin simulation (arch/sim)
|
|||||||
least, partially functional (it has never been rigorously tested).
|
least, partially functional (it has never been rigorously tested).
|
||||||
Status: Open
|
Status: Open
|
||||||
Priority: Low (unless you want to test networking features on the simulation).
|
Priority: Low (unless you want to test networking features on the simulation).
|
||||||
|
|
||||||
Title: ROUND-ROBIN SCHEDULING IN THE SIMULATOR
|
Title: ROUND-ROBIN SCHEDULING IN THE SIMULATOR
|
||||||
Description: Since the simulation is not pre-emptible, you can't use round-robin
|
Description: Since the simulation is not pre-emptible, you can't use round-robin
|
||||||
scheduling (no time slicing). Currently, the timer interrupts are
|
scheduling (no time slicing). Currently, the timer interrupts are
|
||||||
@@ -1361,7 +1361,7 @@ o Linux/Cywgin simulation (arch/sim)
|
|||||||
irqrestore() to block and (conditionally) unblock the signal.
|
irqrestore() to block and (conditionally) unblock the signal.
|
||||||
Status: Open
|
Status: Open
|
||||||
Priority: Low
|
Priority: Low
|
||||||
|
|
||||||
Title: NSH ISSUES ON THE SIMULATOR
|
Title: NSH ISSUES ON THE SIMULATOR
|
||||||
Descripion: The NSH example has some odd behaviors. Mult-tasking -- for example,
|
Descripion: The NSH example has some odd behaviors. Mult-tasking -- for example,
|
||||||
execution of commands in background -- does not work normally. This
|
execution of commands in background -- does not work normally. This
|
||||||
@@ -1455,6 +1455,31 @@ o ARM (arch/arm/)
|
|||||||
If your design needs continous interrupts like this, please try
|
If your design needs continous interrupts like this, please try
|
||||||
the above change and, please, submit a patch with the working fix.
|
the above change and, please, submit a patch with the working fix.
|
||||||
|
|
||||||
|
Title: STACK ALIGNMENT IN INTERRUPT HANDLERS
|
||||||
|
Description: The EABI standard requires that the stack always have a 32-byte
|
||||||
|
alignment. There is no guaratee at present that the stack will be
|
||||||
|
so aligned in an interrupt handler. Therefore, I would expect some
|
||||||
|
issues if, for example, floating point or perhaps long long operations
|
||||||
|
were performed in an interrupt handler.
|
||||||
|
|
||||||
|
This issue exists for ARM7, ARM9, Cortex-M0, Cortex-M3, and
|
||||||
|
Cortex-M4 but has been addressed for the Cortex-A5. The fix
|
||||||
|
is really simple can cannot be incorporated without some
|
||||||
|
substantial testing. For ARM, the fix is the following logic
|
||||||
|
arround each call into C code from assembly:
|
||||||
|
|
||||||
|
mov r4, sp /* Save the SP in a preserved register */
|
||||||
|
bic sp, sp, #7 /* Force 8-byte alignement */
|
||||||
|
bl cfunction /* Call the C function */
|
||||||
|
mov sp, r4 /* Restore the possibly unaligned stack pointer */
|
||||||
|
|
||||||
|
This same issue applies to the interrupt stack which is, I think
|
||||||
|
improperly aligned in almost all cases (except Cortex-A5).
|
||||||
|
|
||||||
|
Status: Open
|
||||||
|
Priority: Low for me because I never do floating point operations in
|
||||||
|
interrupt handlers.
|
||||||
|
|
||||||
o ARM/C5471 (arch/arm/src/c5471/)
|
o ARM/C5471 (arch/arm/src/c5471/)
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
@@ -1590,7 +1615,7 @@ o ARM/LPC214x (arch/arm/src/lpc214x/)
|
|||||||
|
|
||||||
Title: USB BROKEN?
|
Title: USB BROKEN?
|
||||||
Description: I tried to bring up the new configuration at configs/mcu123-214x/composite,
|
Description: I tried to bring up the new configuration at configs/mcu123-214x/composite,
|
||||||
and Linux failed to enumerate the device. I don't know if this is
|
and Linux failed to enumerate the device. I don't know if this is
|
||||||
a problem with the lpc214x USB driver (bit rot), or due to recent
|
a problem with the lpc214x USB driver (bit rot), or due to recent
|
||||||
changed (e.g., -r4359 is suspicious), or an incompatibility between the
|
changed (e.g., -r4359 is suspicious), or an incompatibility between the
|
||||||
Composite driver and the LPC214x USB driver. It will take more work
|
Composite driver and the LPC214x USB driver. It will take more work
|
||||||
@@ -1698,7 +1723,7 @@ o ARM/STM32 (arch/arm/src/stm32/)
|
|||||||
is sent, the driver works fine.
|
is sent, the driver works fine.
|
||||||
Status: Open
|
Status: Open
|
||||||
Priority: Medium-High
|
Priority: Medium-High
|
||||||
|
|
||||||
Title: DMA EXTENSIONS F1/3
|
Title: DMA EXTENSIONS F1/3
|
||||||
Description: DMA logic needs to be extended. DMA2, Channel 5, will not work
|
Description: DMA logic needs to be extended. DMA2, Channel 5, will not work
|
||||||
because the DMA2 channels 4 & 5 share the same interrupt.
|
because the DMA2 channels 4 & 5 share the same interrupt.
|
||||||
@@ -1941,7 +1966,7 @@ o Renesas M16C/26 (arch/sh/src/m16c)
|
|||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
Title: M16C DOES NOT BUILD
|
Title: M16C DOES NOT BUILD
|
||||||
Description: The M16C target cannot be built. The GNU m16c-elf-ld link fails with
|
Description: The M16C target cannot be built. The GNU m16c-elf-ld link fails with
|
||||||
the following message:
|
the following message:
|
||||||
|
|
||||||
m32c-elf-ld: BFD (GNU Binutils) 2.19 assertion fail /home/Owner/projects/nuttx/buildroot/toolchain_build_m32c/binutils-2.19/bfd/elf32-m32c.c:482
|
m32c-elf-ld: BFD (GNU Binutils) 2.19 assertion fail /home/Owner/projects/nuttx/buildroot/toolchain_build_m32c/binutils-2.19/bfd/elf32-m32c.c:482
|
||||||
@@ -2167,7 +2192,7 @@ o z16 (arch/z16)
|
|||||||
Title: ZDS-II COMPILER PROBLEMS
|
Title: ZDS-II COMPILER PROBLEMS
|
||||||
Description: The file drivers/mmcsd/mmcsd_sdio.c generates an internal compiler
|
Description: The file drivers/mmcsd/mmcsd_sdio.c generates an internal compiler
|
||||||
error like:
|
error like:
|
||||||
|
|
||||||
mmcsd\mmcsd_sdio.c
|
mmcsd\mmcsd_sdio.c
|
||||||
Internal Error(0503) On line 2504 of "MMCSD\MMCSD_SDIO.C"
|
Internal Error(0503) On line 2504 of "MMCSD\MMCSD_SDIO.C"
|
||||||
File <c3>, Args(562,46)
|
File <c3>, Args(562,46)
|
||||||
@@ -2182,7 +2207,7 @@ o z16 (arch/z16)
|
|||||||
reliable Windows native build. As of this writing, the Cygwin
|
reliable Windows native build. As of this writing, the Cygwin
|
||||||
based build has not been re-verified.
|
based build has not been re-verified.
|
||||||
Status: Open
|
Status: Open
|
||||||
Priority: Low -- I don't think anyone uses the Z16 port.
|
Priority: Low -- I don't think anyone uses the Z16 port.
|
||||||
|
|
||||||
o mc68hc1x (arch/hc)
|
o mc68hc1x (arch/hc)
|
||||||
^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^
|
||||||
@@ -2219,7 +2244,7 @@ o Network Utilities (apps/netutils/)
|
|||||||
|
|
||||||
Title: THE ARP ISSUES AGAIN
|
Title: THE ARP ISSUES AGAIN
|
||||||
Description: The first GET received by THTTPD is not responded to. Refreshing the page
|
Description: The first GET received by THTTPD is not responded to. Refreshing the page
|
||||||
from the browser solves the problem and THTTPD works fine after thatg. I
|
from the browser solves the problem and THTTPD works fine after thatg. I
|
||||||
believe that this is the duplicate of another bug: "Outgoing [uIP] packets are dropped
|
believe that this is the duplicate of another bug: "Outgoing [uIP] packets are dropped
|
||||||
and overwritten by ARP packets if the destination IP has not been mapped to a MAC."
|
and overwritten by ARP packets if the destination IP has not been mapped to a MAC."
|
||||||
Status: Open
|
Status: Open
|
||||||
|
|||||||
@@ -134,10 +134,15 @@ arm_vectorirq:
|
|||||||
#if CONFIG_ARCH_INTERRUPTSTACK > 3
|
#if CONFIG_ARCH_INTERRUPTSTACK > 3
|
||||||
ldr sp, .Lirqstackbase /* SP = interrupt stack base */
|
ldr sp, .Lirqstackbase /* SP = interrupt stack base */
|
||||||
str r0, [sp] /* Save the user stack pointer */
|
str r0, [sp] /* Save the user stack pointer */
|
||||||
|
mov r4, sp /* Save the SP in a preserved register */
|
||||||
|
bic sp, sp, #7 /* Force 8-byte alignement */
|
||||||
bl up_decodeirq /* Call the handler */
|
bl up_decodeirq /* Call the handler */
|
||||||
ldr sp, [sp] /* Restore the user stack pointer */
|
ldr sp, [r4] /* Restore the user stack pointer */
|
||||||
#else
|
#else
|
||||||
|
mov r4, sp /* Save the SP in a preserved register */
|
||||||
|
bic sp, sp, #7 /* Force 8-byte alignement */
|
||||||
bl up_decodeirq /* Call the handler */
|
bl up_decodeirq /* Call the handler */
|
||||||
|
mov sp, r4 /* Restore the possibly unaligned stack pointer */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Restore the CPSR, SVC modr registers and return */
|
/* Restore the CPSR, SVC modr registers and return */
|
||||||
@@ -192,7 +197,10 @@ arm_vectorswi:
|
|||||||
|
|
||||||
mov fp, #0 /* Init frame pointer */
|
mov fp, #0 /* Init frame pointer */
|
||||||
mov r0, sp /* Get r0=xcp */
|
mov r0, sp /* Get r0=xcp */
|
||||||
|
mov r4, sp /* Save the SP in a preserved register */
|
||||||
|
bic sp, sp, #7 /* Force 8-byte alignement */
|
||||||
bl up_syscall /* Call the handler */
|
bl up_syscall /* Call the handler */
|
||||||
|
mov sp, r4 /* Restore the possibly unaligned stack pointer */
|
||||||
|
|
||||||
/* Restore the CPSR, SVC modr registers and return */
|
/* Restore the CPSR, SVC modr registers and return */
|
||||||
|
|
||||||
@@ -262,7 +270,10 @@ arm_vectordata:
|
|||||||
mov r0, sp /* Get r0=xcp */
|
mov r0, sp /* Get r0=xcp */
|
||||||
mrc CP15_DFAR(r1) /* Get R1=DFAR */
|
mrc CP15_DFAR(r1) /* Get R1=DFAR */
|
||||||
mrc CP15_DFSR(r2) /* Get r2=DFSR */
|
mrc CP15_DFSR(r2) /* Get r2=DFSR */
|
||||||
|
mov r4, sp /* Save the SP in a preserved register */
|
||||||
|
bic sp, sp, #7 /* Force 8-byte alignement */
|
||||||
bl arm_dataabort /* Call the handler */
|
bl arm_dataabort /* Call the handler */
|
||||||
|
mov sp, r4 /* Restore the possibly unaligned stack pointer */
|
||||||
|
|
||||||
/* Restore the CPSR, SVC modr registers and return */
|
/* Restore the CPSR, SVC modr registers and return */
|
||||||
|
|
||||||
@@ -335,7 +346,10 @@ arm_vectorprefetch:
|
|||||||
mov r0, sp /* Get r0=xcp */
|
mov r0, sp /* Get r0=xcp */
|
||||||
mrc CP15_IFAR(r1) /* Get R1=IFAR */
|
mrc CP15_IFAR(r1) /* Get R1=IFAR */
|
||||||
mrc CP15_IFSR(r2) /* Get r2=IFSR */
|
mrc CP15_IFSR(r2) /* Get r2=IFSR */
|
||||||
|
mov r4, sp /* Save the SP in a preserved register */
|
||||||
|
bic sp, sp, #7 /* Force 8-byte alignement */
|
||||||
bl arm_prefetchabort /* Call the handler */
|
bl arm_prefetchabort /* Call the handler */
|
||||||
|
mov sp, r4 /* Restore the possibly unaligned stack pointer */
|
||||||
|
|
||||||
/* Restore the CPSR, SVC modr registers and return */
|
/* Restore the CPSR, SVC modr registers and return */
|
||||||
|
|
||||||
@@ -403,7 +417,10 @@ arm_vectorundefinsn:
|
|||||||
|
|
||||||
mov fp, #0 /* Init frame pointer */
|
mov fp, #0 /* Init frame pointer */
|
||||||
mov r0, sp /* Get r0=xcp */
|
mov r0, sp /* Get r0=xcp */
|
||||||
|
mov r4, sp /* Save the SP in a preserved register */
|
||||||
|
bic sp, sp, #7 /* Force 8-byte alignement */
|
||||||
bl arm_undefinedinsn /* Call the handler */
|
bl arm_undefinedinsn /* Call the handler */
|
||||||
|
mov sp, r4 /* Restore the possibly unaligned stack pointer */
|
||||||
|
|
||||||
/* Restore the CPSR, SVC modr registers and return */
|
/* Restore the CPSR, SVC modr registers and return */
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user