/** xtensa_ops.h
 *
 * Special macros/etc which deal with Xtensa-specific architecture/CPU
 * considerations.
 *
 * Part of esp-open-rtos
 * Copyright (C) 2015 Superhouse Automation Pty Ltd
 * BSD Licensed as described in the file LICENSE
 */

#ifndef _XTENSA_OPS_H
#define _XTENSA_OPS_H

/* Read stack pointer to variable.
 *
 * Note that the compiler will push a stack frame (minimum 16 bytes)
 * in the prelude of a C function that calls any other functions.
 */
#define SP(var) asm volatile ("mov %0, a1" : "=r" (var))

/* Read the function return address to a variable.
 *
 * Depends on the containing function being simple enough that a0 is
 * being used as a working register.
 */
#define RETADDR(var) asm volatile ("mov %0, a0" : "=r" (var))

// GCC macros for reading, writing, and exchanging Xtensa processor special
// registers:

#define RSR(var, reg) asm volatile ("rsr %0, " #reg : "=r" (var));
#define WSR(var, reg) asm volatile ("wsr %0, " #reg : : "r" (var));
#define XSR(var, reg) asm volatile ("xsr %0, " #reg : "+r" (var));

// GCC macros for performing associated "*sync" opcodes

#define ISYNC() asm volatile ( "isync" )
#define RSYNC() asm volatile ( "rsync" )
#define ESYNC() asm volatile ( "esync" )
#define DSYNC() asm volatile ( "dsync" )

#endif /* _XTENSA_OPS_H */