15790Sgblack@eecs.umich.edu/*
25790Sgblack@eecs.umich.edu * Copyright (c) 2003-2006 The Regents of The University of Michigan
35790Sgblack@eecs.umich.edu * All rights reserved.
45790Sgblack@eecs.umich.edu *
55790Sgblack@eecs.umich.edu * Redistribution and use in source and binary forms, with or without
65790Sgblack@eecs.umich.edu * modification, are permitted provided that the following conditions are
75790Sgblack@eecs.umich.edu * met: redistributions of source code must retain the above copyright
85790Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer;
95790Sgblack@eecs.umich.edu * redistributions in binary form must reproduce the above copyright
105790Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the
115790Sgblack@eecs.umich.edu * documentation and/or other materials provided with the distribution;
125790Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its
135790Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from
145790Sgblack@eecs.umich.edu * this software without specific prior written permission.
155790Sgblack@eecs.umich.edu *
165790Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
175790Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
185790Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
195790Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
205790Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
215790Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
225790Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
235790Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
245790Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
255790Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
265790Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
275790Sgblack@eecs.umich.edu *
285790Sgblack@eecs.umich.edu * Authors: Gabe Black
295790Sgblack@eecs.umich.edu *          Nathan Binkert
305790Sgblack@eecs.umich.edu *          Ali Saidi
315790Sgblack@eecs.umich.edu */
325790Sgblack@eecs.umich.edu
3312157Sandreas.sandberg@arm.com#include <gem5/asm/generic/m5ops.h>
345790Sgblack@eecs.umich.edu
3512459Sjang.hanhwi@gmail.com#if defined(M5OP_ADDR) && defined(M5OP_PIC)
3612459Sjang.hanhwi@gmail.com/* Use the memory mapped m5op interface */
3712459Sjang.hanhwi@gmail.com#define TWO_BYTE_OP(name, number)         \
3812459Sjang.hanhwi@gmail.com        .globl name;                      \
3912459Sjang.hanhwi@gmail.com        .func name;                       \
4012459Sjang.hanhwi@gmail.comname:                                     \
4112459Sjang.hanhwi@gmail.com        mov m5_mem@gotpcrel(%rip), %r11;  \
4212459Sjang.hanhwi@gmail.com        mov (%r11), %r11;                 \
4312459Sjang.hanhwi@gmail.com        mov $number, %rax;                \
4412459Sjang.hanhwi@gmail.com        shl $8, %rax;                     \
4512459Sjang.hanhwi@gmail.com        mov 0(%r11, %rax, 1), %rax;       \
4612459Sjang.hanhwi@gmail.com        ret;                              \
4712459Sjang.hanhwi@gmail.com        .endfunc;
4812459Sjang.hanhwi@gmail.com
4912459Sjang.hanhwi@gmail.com#elif defined(M5OP_ADDR) && !defined(M5OP_PIC)
509898Sandreas@sandberg.pp.se/* Use the memory mapped m5op interface */
519898Sandreas@sandberg.pp.se#define TWO_BYTE_OP(name, number)         \
529898Sandreas@sandberg.pp.se        .globl name;                      \
539898Sandreas@sandberg.pp.se        .func name;                       \
549898Sandreas@sandberg.pp.sename:                                     \
559898Sandreas@sandberg.pp.se        mov m5_mem, %r11;                 \
569898Sandreas@sandberg.pp.se        mov $number, %rax;                \
579898Sandreas@sandberg.pp.se        shl $8, %rax;                     \
589898Sandreas@sandberg.pp.se        mov 0(%r11, %rax, 1), %rax;       \
599898Sandreas@sandberg.pp.se        ret;                              \
609898Sandreas@sandberg.pp.se        .endfunc;
6112464Sjang.hanhwi@gmail.com
629898Sandreas@sandberg.pp.se#else
639898Sandreas@sandberg.pp.se/* Use the magic instruction based m5op interface. This does not work
649898Sandreas@sandberg.pp.se * in virtualized environments.
659898Sandreas@sandberg.pp.se */
669898Sandreas@sandberg.pp.se
675790Sgblack@eecs.umich.edu#define TWO_BYTE_OP(name, number)         \
685790Sgblack@eecs.umich.edu        .globl name;                      \
695790Sgblack@eecs.umich.edu        .func name;                       \
705790Sgblack@eecs.umich.eduname:                                     \
715790Sgblack@eecs.umich.edu        .byte 0x0F, 0x04;                 \
725790Sgblack@eecs.umich.edu        .word number;                     \
735790Sgblack@eecs.umich.edu        ret;                              \
745790Sgblack@eecs.umich.edu        .endfunc;
755790Sgblack@eecs.umich.edu
769898Sandreas@sandberg.pp.se#endif
779898Sandreas@sandberg.pp.se
7812160Sandreas.sandberg@arm.comTWO_BYTE_OP(m5_arm, M5OP_ARM)
7912160Sandreas.sandberg@arm.comTWO_BYTE_OP(m5_quiesce, M5OP_QUIESCE)
8012160Sandreas.sandberg@arm.comTWO_BYTE_OP(m5_quiesce_ns, M5OP_QUIESCE_NS)
8112160Sandreas.sandberg@arm.comTWO_BYTE_OP(m5_quiesce_cycle, M5OP_QUIESCE_CYCLE)
8212160Sandreas.sandberg@arm.comTWO_BYTE_OP(m5_quiesce_time, M5OP_QUIESCE_TIME)
8312160Sandreas.sandberg@arm.comTWO_BYTE_OP(m5_rpns, M5OP_RPNS)
8412424Sjang.hanhwi@gmail.comTWO_BYTE_OP(m5_wake_cpu, M5OP_WAKE_CPU)
8512157Sandreas.sandberg@arm.comTWO_BYTE_OP(m5_exit, M5OP_EXIT)
8612157Sandreas.sandberg@arm.comTWO_BYTE_OP(m5_fail, M5OP_FAIL)
8712160Sandreas.sandberg@arm.comTWO_BYTE_OP(m5_init_param, M5OP_INIT_PARAM)
8812160Sandreas.sandberg@arm.comTWO_BYTE_OP(m5_load_symbol, M5OP_LOAD_SYMBOL)
8912157Sandreas.sandberg@arm.comTWO_BYTE_OP(m5_reset_stats, M5OP_RESET_STATS)
9012157Sandreas.sandberg@arm.comTWO_BYTE_OP(m5_dump_stats, M5OP_DUMP_STATS)
9112160Sandreas.sandberg@arm.comTWO_BYTE_OP(m5_dump_reset_stats, M5OP_DUMP_RESET_STATS)
9212157Sandreas.sandberg@arm.comTWO_BYTE_OP(m5_checkpoint, M5OP_CHECKPOINT)
9312160Sandreas.sandberg@arm.comTWO_BYTE_OP(m5_read_file, M5OP_READ_FILE)
9412160Sandreas.sandberg@arm.comTWO_BYTE_OP(m5_write_file, M5OP_WRITE_FILE)
9512160Sandreas.sandberg@arm.comTWO_BYTE_OP(m5_debug_break, M5OP_DEBUG_BREAK)
9612160Sandreas.sandberg@arm.comTWO_BYTE_OP(m5_switch_cpu, M5OP_SWITCH_CPU)
9712160Sandreas.sandberg@arm.comTWO_BYTE_OP(m5_add_symbol, M5OP_ADD_SYMBOL)
9812157Sandreas.sandberg@arm.comTWO_BYTE_OP(m5_panic, M5OP_PANIC)
9912157Sandreas.sandberg@arm.comTWO_BYTE_OP(m5_work_begin, M5OP_WORK_BEGIN)
10012157Sandreas.sandberg@arm.comTWO_BYTE_OP(m5_work_end, M5OP_WORK_END)
10112160Sandreas.sandberg@arm.comTWO_BYTE_OP(m5_dist_toggle_sync, M5OP_DIST_TOGGLE_SYNC)
102