Annotation of qemu/hostregs_helper.h, revision 1.1.1.4

1.1       root        1: /*
1.1.1.4 ! root        2:  *  Save/restore host registers.
1.1       root        3:  *
                      4:  *  Copyright (c) 2007 CodeSourcery
                      5:  *
                      6:  * This library is free software; you can redistribute it and/or
                      7:  * modify it under the terms of the GNU Lesser General Public
                      8:  * License as published by the Free Software Foundation; either
                      9:  * version 2 of the License, or (at your option) any later version.
                     10:  *
                     11:  * This library is distributed in the hope that it will be useful,
                     12:  * but WITHOUT ANY WARRANTY; without even the implied warranty of
                     13:  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
                     14:  * Lesser General Public License for more details.
                     15:  *
                     16:  * You should have received a copy of the GNU Lesser General Public
1.1.1.3   root       17:  * License along with this library; if not, see <http://www.gnu.org/licenses/>.
1.1       root       18:  */
                     19: 
1.1.1.2   root       20: /* The GCC global register variable extension is used to reserve some
                     21:    host registers for use by generated code.  However only the core parts of
                     22:    the translation engine are compiled with these settings.  We must manually
1.1       root       23:    save/restore these registers when called from regular code.
                     24:    It is not sufficient to save/restore T0 et. al. as these may be declared
                     25:    with a datatype smaller than the actual register.  */
                     26: 
                     27: #if defined(DECLARE_HOST_REGS)
                     28: 
                     29: #define DO_REG(REG)                                    \
                     30:     register host_reg_t reg_AREG##REG asm(AREG##REG);  \
                     31:     volatile host_reg_t saved_AREG##REG;
                     32: 
                     33: #elif defined(SAVE_HOST_REGS)
                     34: 
                     35: #define DO_REG(REG)                                    \
                     36:     __asm__ __volatile__ ("" : "=r" (reg_AREG##REG));  \
                     37:     saved_AREG##REG = reg_AREG##REG;
                     38: 
                     39: #else
                     40: 
                     41: #define DO_REG(REG)                                     \
                     42:     reg_AREG##REG = saved_AREG##REG;                   \
                     43:     __asm__ __volatile__ ("" : : "r" (reg_AREG##REG));
                     44: 
                     45: #endif
                     46: 
                     47: #ifdef AREG0
                     48: DO_REG(0)
                     49: #endif
                     50: 
                     51: #ifdef AREG1
                     52: DO_REG(1)
                     53: #endif
                     54: 
                     55: #ifdef AREG2
                     56: DO_REG(2)
                     57: #endif
                     58: 
                     59: #undef SAVE_HOST_REGS
                     60: #undef DECLARE_HOST_REGS
                     61: #undef DO_REG

unix.superglobalmegacorp.com