ARM System Calls: Difference between revisions

m
Bot: Replace deprecated source tag with syntaxhighlight
[unchecked revision][unchecked revision]
No edit summary
m (Bot: Replace deprecated source tag with syntaxhighlight)
 
(3 intermediate revisions by 2 users not shown)
Line 6:
<pre>mov pc, lr</pre>
Most of the time you won't need to worry about returning from the interrupt, as GCC, set up to cross compile for ARM, lets you code the interrupt handlers in C:
<sourcesyntaxhighlight lang="c">void swi_handler () __attribute__((interrupt));</sourcesyntaxhighlight>
 
==Creating System Calls==
Line 19:
b . @ FIQ
</pre>
This is the ARM equivalent to the IDT, on the x86, and it is stored by default at address 0. The only entry, we need to worry about is the SWI Handler. To install our own SWI handler, we replace the <span style="font-family:monospace">b .</span> instruction with a branch to our handler:
<pre>
interrupt_vector_table:
Line 31:
</pre>
We can code the interrupt handler like this:
<sourcesyntaxhighlight lang="c">
void __attribute__ ((interrupt ("SWI"))) swi_handler (void) {}
</syntaxhighlight>
</source>
Parameters to functions on ARM, are passed in registers r0-r3, if follow the same convention for system calls, then our interrupt handler can take parameters:
<sourcesyntaxhighlight lang="c">
void __attribute__ ((interrupt ("SWI"))) swi_handler (int r0, int r1, int r2, int r3) {}
</syntaxhighlight>
</source>
You have've probably noticed from the first examplethat (<span style="font-family:monospace">swi 0x420000</span>), that swi takes an integer as an argument. For it to work in both ARM and THUMB modes of the processor, the integer must be left shifted by 16. To get this integerargument in the C code, we have to do this:
<sourcesyntaxhighlight lang="c">
uint8_t int_vector = 0;
asm volatile ("ldrb %0, [lr, #-2]" : "=r" (int_vector));
</syntaxhighlight>
</source>
This loads the high 8 bits (16-23) of the argument into <span style="font-family:monospace">int_vector</span>, as loading the full 24-bits won't work using Thumb.
 
[[Category:ARM]]
[[Category:System Calls]]
[[Category:In Progress]]