diff options
| author | kyeongwoon <kyeongwoon.lee@samsung.com> | 2012-11-30 09:21:49 +0900 |
|---|---|---|
| committer | Brian Anderson <banderson@mozilla.com> | 2013-01-13 16:43:39 -0800 |
| commit | 987f824f233faee4aed39dac92a1b442d42965cc (patch) | |
| tree | 2cf1b078738e9bf580b9ee43f674d95c403751fa /src/rt/arch/arm/context.cpp | |
| parent | 27e6a0fa5651dbda55773488c8b706adfa5cefc2 (diff) | |
| download | rust-987f824f233faee4aed39dac92a1b442d42965cc.tar.gz rust-987f824f233faee4aed39dac92a1b442d42965cc.zip | |
Support ARM and Android
Conflicts: src/libcore/os.rs src/librustc/back/link.rs src/librustc/driver/driver.rs src/librustc/metadata/loader.rs src/librustc/middle/trans/base.rs
Diffstat (limited to 'src/rt/arch/arm/context.cpp')
| -rw-r--r-- | src/rt/arch/arm/context.cpp | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/src/rt/arch/arm/context.cpp b/src/rt/arch/arm/context.cpp new file mode 100644 index 00000000000..dbf06a532a8 --- /dev/null +++ b/src/rt/arch/arm/context.cpp @@ -0,0 +1,36 @@ + +#include "context.h" +#include "../../rust_globals.h" + +extern "C" void CDECL swap_registers(registers_t *oregs, + registers_t *regs) +asm ("swap_registers"); + +context::context() +{ + assert((void*)®s == (void*)this); + memset(®s, 0, sizeof(regs)); +} + +void context::swap(context &out) +{ + swap_registers(&out.regs, ®s); +} + +void context::call(void *f, void *arg, void *stack) +{ + // Get the current context, which we will then modify to call the + // given function. + swap(*this); + + // set up the stack + uint32_t *sp = ( uint32_t *)stack; + //sp = align_down(sp); + // The final return address. 0 indicates the bottom of the stack + *--sp = 0; + + regs.data[0] = ( uint32_t )arg; // r0 + regs.data[13] = ( uint32_t )sp; //#52 sp, r13 + regs.data[14] = ( uint32_t )f; //#60 pc, r15 --> lr, + // Last base pointer on the stack should be 0 +} |
