summaryrefslogtreecommitdiff
path: root/big-little/switcher/trigger/handle_switchover.s
diff options
context:
space:
mode:
Diffstat (limited to 'big-little/switcher/trigger/handle_switchover.s')
-rw-r--r--big-little/switcher/trigger/handle_switchover.s61
1 files changed, 61 insertions, 0 deletions
diff --git a/big-little/switcher/trigger/handle_switchover.s b/big-little/switcher/trigger/handle_switchover.s
new file mode 100644
index 0000000..d18ba21
--- /dev/null
+++ b/big-little/switcher/trigger/handle_switchover.s
@@ -0,0 +1,61 @@
+ ;
+ ; Copyright (c) 2011, ARM Limited. All rights reserved.
+ ;
+ ; Redistribution and use in source and binary forms, with
+ ; or without modification, are permitted provided that the
+ ; following conditions are met:
+ ;
+ ; Redistributions of source code must retain the above
+ ; copyright notice, this list of conditions and the
+ ; following disclaimer.
+ ;
+ ; Redistributions in binary form must reproduce the
+ ; above copyright notice, this list of conditions and
+ ; the following disclaimer in the documentation
+ ; and/or other materials provided with the distribution.
+ ;
+ ; Neither the name of ARM nor the names of its
+ ; contributors may be used to endorse or promote products
+ ; derived from this software without specific prior written
+ ; permission.
+ ;
+
+ AREA SwitchoverCode, CODE, READONLY, ALIGN=5
+
+ PRESERVE8
+
+ IMPORT save_context
+ IMPORT smc
+ EXPORT switch_cluster
+
+SMC_SEC_SHUTDOWN EQU 0x2
+
+ ; ----------------------------------------------------
+ ; This function directs the switchover to the inbound
+ ; cluster. The context is first saved, stacks switched
+ ; & the cluster is powered down.
+ ; We need to switch stacks from being resident in normal
+ ; WBWA/S memory to SO memory to prevent potential stack
+ ; corruption after turning off the C bit in the HSCTLR.
+ ; Subsequent accesses will be SO while there will be
+ ; valid cache lines of the stack from prior accesses
+ ; ----------------------------------------------------
+switch_cluster FUNCTION
+ ; ----------------------------------------------------
+ ; We don't push any registers on the stack as we are
+ ; not going to return from this function
+ ; ----------------------------------------------------
+ MOV r4, r0
+ BL save_context
+ ; ----------------------------------------------------
+ ; We are now through with saving the context and the
+ ; inbound cluster has started picking it up. Switch to
+ ; the secure world to clean the caches and power down
+ ; the cluster
+ ; ----------------------------------------------------
+ MOV r0, #SMC_SEC_SHUTDOWN
+ BL smc
+ ENDFUNC
+
+ END
+