// how to make __ex_table with .text.fixup table
.config
#CONFIG_THUMB2_KERNEL is not set
//get [usracc] define
~myandroid/kernel_imx/arch/arm/include/asm/assembler.h
.macro usracc, instr, reg, ptr, inc, cond, rept, abort, t=TUSER()
.rept \rept
9999:
.if \inc == 1
\instr\cond\()b\()\t \reg, [\ptr], #\inc
.elseif \inc == 4
\instr\cond\()\t \reg, [\ptr], #\inc
.else
.error "Unsupported inc macro argument"
.endif
.pushsection __ex_table,"a"
.align 3
.long 9999b, \abort
.popsection
.endr
.endm
labelf = label forward
labelb = label backward
9999b - >
9999:
///get [ldrusr] define
~myandroid/kernel_imx/arch/arm/include/asm/assembler.h
.macro ldrusr, reg, ptr, inc, cond=al, rept=1, abort=9001f
usracc ldr, \reg, \ptr, \inc, \cond, \rept, \abort
.endm
The 'abort' argument is used for fixup tables
///get [ldr8w] define
~myandroid/kernel_imx/arch/arm/lib/copy_from_user.S
.macro ldr8w ptr reg1 reg2 reg3 reg4 reg5 reg6 reg7 reg8 abort
ldr4w \ptr, \reg1, \reg2, \reg3, \reg4, \abort
ldr4w \ptr, \reg5, \reg6, \reg7, \reg8, \abort
.endm
.macro ldr4w ptr reg1 reg2 reg3 reg4 abort
ldr1w \ptr, \reg1, \abort
ldr1w \ptr, \reg2, \abort
ldr1w \ptr, \reg3, \abort
ldr1w \ptr, \reg4, \abort
.endm
.macro ldr1w ptr reg abort
ldrusr \reg, \ptr, 4, abort=\abort
.endm
The 'abort' argument is used for fixup tables
///get [copy_abort_preamble]
19: ldmfd sp!, {r5 - r9}
b 21f
20: ldmfd sp!, {r5 - r8}
21:
//get [copy_abort_end]
ldmfd sp!, {r4, pc}
///
~myandroid/kernel_imx/arch/arm/lib/copy_template.S
ldr8w r1, r3, r4, r5, r6, r7, r8, ip, lr, abort=20f
expand ldr8w command:
c05d0034: ldr r3, [r1], #4
c05d0038: ldr r4, [r1], #4
c05d003c: ldr r5, [r1], #4
c05d0040: ldr r6, [r1], #4
c05d0044: ldr r7, [r1], #4
c05d0048: ldr r8, [r1], #4
c05d004c: ldr r12, [r1], #4
c05d0050: ldr lr, [r1], #4
labelf = label forward
labelb = label backward
abort = 20f
///
~myandroid/kernel_imx/arch/arm/lib/copy_from_user.S
ENTRY(__copy_from_user)
#include "copy_template.S"
ENDPROC(__copy_from_user)
.pushsection .text.fixup,"ax"
.align 0
copy_abort_preamble
ldmfd sp!, {r1, r2}
sub r3, r0, r1
rsb r1, r3, r2
str r1, [sp]
bl __memzero
ldr r0, [sp], #4
copy_abort_end
.popsection
///.pushsection .text.fixup,"ax" translate to ->
.pushsection .text.fixup,"ax"
.align 0
19: ldmfd sp!, {r5 - r9}
b 21f
20: ldmfd sp!, {r5 - r8}
21:
ldmfd sp!, {r1, r2}
sub r3, r0, r1
rsb r1, r3, r2
str r1, [sp]
bl __memzero
ldr r0, [sp], #4
ldmfd sp!, {r4, pc}
.popsection