Commit a0a839b6 authored by Marek Vasut's avatar Marek Vasut Committed by Richard Henderson
Browse files

nios2: Add usermode binaries emulation



Add missing bits for qemu-user required for emulating Altera Nios2
userspace binaries.

Signed-off-by: default avatarMarek Vasut <marex@denx.de>
Cc: Chris Wulff <crwulff@gmail.com>
Cc: Jeff Da Silva <jdasilva@altera.com>
Cc: Ley Foon Tan <lftan@altera.com>
Cc: Sandra Loosemore <sandra@codesourcery.com>
Cc: Yves Vandervennet <yvanderv@altera.com>
Reviewed-by: default avatarAlexander Graf <agraf@suse.de>
Message-Id: <20170118220146.489-4-marex@denx.de>
Signed-off-by: default avatarRichard Henderson <rth@twiddle.net>
parent 3f0c3423
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -126,6 +126,8 @@ typedef int64_t Elf64_Sxword;
 */
#define EM_S390_OLD     0xA390

#define EM_ALTERA_NIOS2 113     /* Altera Nios II soft-core processor */

#define EM_MICROBLAZE      189
#define EM_MICROBLAZE_OLD  0xBAAB

+57 −0
Original line number Diff line number Diff line
@@ -967,6 +967,63 @@ static void elf_core_copy_regs(target_elf_gregset_t *regs, const CPUMBState *env

#endif /* TARGET_MICROBLAZE */

#ifdef TARGET_NIOS2

#define ELF_START_MMAP 0x80000000

#define elf_check_arch(x) ((x) == EM_ALTERA_NIOS2)

#define ELF_CLASS   ELFCLASS32
#define ELF_ARCH    EM_ALTERA_NIOS2

static void init_thread(struct target_pt_regs *regs, struct image_info *infop)
{
    regs->ea = infop->entry;
    regs->sp = infop->start_stack;
    regs->estatus = 0x3;
}

#define ELF_EXEC_PAGESIZE        4096

#define USE_ELF_CORE_DUMP
#define ELF_NREG 49
typedef target_elf_greg_t target_elf_gregset_t[ELF_NREG];

/* See linux kernel: arch/mips/kernel/process.c:elf_dump_regs.  */
static void elf_core_copy_regs(target_elf_gregset_t *regs,
                               const CPUNios2State *env)
{
    int i;

    (*regs)[0] = -1;
    for (i = 1; i < 8; i++)    /* r0-r7 */
        (*regs)[i] = tswapreg(env->regs[i + 7]);

    for (i = 8; i < 16; i++)   /* r8-r15 */
        (*regs)[i] = tswapreg(env->regs[i - 8]);

    for (i = 16; i < 24; i++)  /* r16-r23 */
        (*regs)[i] = tswapreg(env->regs[i + 7]);
    (*regs)[24] = -1;    /* R_ET */
    (*regs)[25] = -1;    /* R_BT */
    (*regs)[26] = tswapreg(env->regs[R_GP]);
    (*regs)[27] = tswapreg(env->regs[R_SP]);
    (*regs)[28] = tswapreg(env->regs[R_FP]);
    (*regs)[29] = tswapreg(env->regs[R_EA]);
    (*regs)[30] = -1;    /* R_SSTATUS */
    (*regs)[31] = tswapreg(env->regs[R_RA]);

    (*regs)[32] = tswapreg(env->regs[R_PC]);

    (*regs)[33] = -1; /* R_STATUS */
    (*regs)[34] = tswapreg(env->regs[CR_ESTATUS]);

    for (i = 35; i < 49; i++)    /* ... */
        (*regs)[i] = -1;
}

#endif /* TARGET_NIOS2 */

#ifdef TARGET_OPENRISC

#define ELF_START_MMAP 0x08000000
+138 −2
Original line number Diff line number Diff line
@@ -68,8 +68,11 @@ do { \
 * This way we will never overlap with our own libraries or binaries or stack
 * or anything else that QEMU maps.
 */
# ifdef TARGET_MIPS
/* MIPS only supports 31 bits of virtual address space for user space */
# if defined(TARGET_MIPS) || defined(TARGET_NIOS2)
/*
 * MIPS only supports 31 bits of virtual address space for user space.
 * Nios2 also only supports 31 bits.
 */
unsigned long reserved_va = 0x77000000;
# else
unsigned long reserved_va = 0xf7000000;
@@ -2462,6 +2465,109 @@ error:
}
#endif

#ifdef TARGET_NIOS2

void cpu_loop(CPUNios2State *env)
{
    CPUState *cs = ENV_GET_CPU(env);
    Nios2CPU *cpu = NIOS2_CPU(cs);
    target_siginfo_t info;
    int trapnr, gdbsig, ret;

    for (;;) {
        cpu_exec_start(cs);
        trapnr = cpu_exec(cs);
        cpu_exec_end(cs);
        gdbsig = 0;

        switch (trapnr) {
        case EXCP_INTERRUPT:
            /* just indicate that signals should be handled asap */
            break;
        case EXCP_TRAP:
            if (env->regs[R_AT] == 0) {
                abi_long ret;
                qemu_log_mask(CPU_LOG_INT, "\nSyscall\n");

                ret = do_syscall(env, env->regs[2],
                                 env->regs[4], env->regs[5], env->regs[6],
                                 env->regs[7], env->regs[8], env->regs[9],
                                 0, 0);

                if (env->regs[2] == 0) {    /* FIXME: syscall 0 workaround */
                    ret = 0;
                }

                env->regs[2] = abs(ret);
                /* Return value is 0..4096 */
                env->regs[7] = (ret > 0xfffffffffffff000ULL);
                env->regs[CR_ESTATUS] = env->regs[CR_STATUS];
                env->regs[CR_STATUS] &= ~0x3;
                env->regs[R_EA] = env->regs[R_PC] + 4;
                env->regs[R_PC] += 4;
                break;
            } else {
                qemu_log_mask(CPU_LOG_INT, "\nTrap\n");

                env->regs[CR_ESTATUS] = env->regs[CR_STATUS];
                env->regs[CR_STATUS] &= ~0x3;
                env->regs[R_EA] = env->regs[R_PC] + 4;
                env->regs[R_PC] = cpu->exception_addr;

                gdbsig = TARGET_SIGTRAP;
                break;
            }
        case 0xaa:
            switch (env->regs[R_PC]) {
            /*case 0x1000:*/  /* TODO:__kuser_helper_version */
            case 0x1004:      /* __kuser_cmpxchg */
                start_exclusive();
                if (env->regs[4] & 0x3) {
                    goto kuser_fail;
                }
                ret = get_user_u32(env->regs[2], env->regs[4]);
                if (ret) {
                    end_exclusive();
                    goto kuser_fail;
                }
                env->regs[2] -= env->regs[5];
                if (env->regs[2] == 0) {
                    put_user_u32(env->regs[6], env->regs[4]);
                }
                end_exclusive();
                env->regs[R_PC] = env->regs[R_RA];
                break;
            /*case 0x1040:*/  /* TODO:__kuser_sigtramp */
            default:
                ;
kuser_fail:
                info.si_signo = TARGET_SIGSEGV;
                info.si_errno = 0;
                /* TODO: check env->error_code */
                info.si_code = TARGET_SEGV_MAPERR;
                info._sifields._sigfault._addr = env->regs[R_PC];
                queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
            }
            break;
        default:
            EXCP_DUMP(env, "\nqemu: unhandled CPU exception %#x - aborting\n",
                     trapnr);
            gdbsig = TARGET_SIGILL;
            break;
        }
        if (gdbsig) {
            gdb_handlesig(cs, gdbsig);
            if (gdbsig != TARGET_SIGTRAP) {
                exit(EXIT_FAILURE);
            }
        }

        process_pending_signals(env);
    }
}

#endif /* TARGET_NIOS2 */

#ifdef TARGET_OPENRISC

void cpu_loop(CPUOpenRISCState *env)
@@ -4632,6 +4738,36 @@ int main(int argc, char **argv, char **envp)
            restore_snan_bit_mode(env);
        }
    }
#elif defined(TARGET_NIOS2)
    {
        env->regs[0] = 0;
        env->regs[1] = regs->r1;
        env->regs[2] = regs->r2;
        env->regs[3] = regs->r3;
        env->regs[4] = regs->r4;
        env->regs[5] = regs->r5;
        env->regs[6] = regs->r6;
        env->regs[7] = regs->r7;
        env->regs[8] = regs->r8;
        env->regs[9] = regs->r9;
        env->regs[10] = regs->r10;
        env->regs[11] = regs->r11;
        env->regs[12] = regs->r12;
        env->regs[13] = regs->r13;
        env->regs[14] = regs->r14;
        env->regs[15] = regs->r15;
        /* TODO: unsigned long  orig_r2; */
        env->regs[R_RA] = regs->ra;
        env->regs[R_FP] = regs->fp;
        env->regs[R_SP] = regs->sp;
        env->regs[R_GP] = regs->gp;
        env->regs[CR_ESTATUS] = regs->estatus;
        env->regs[R_EA] = regs->ea;
        /* TODO: unsigned long  orig_r7; */

        /* Emulate eret when starting thread. */
        env->regs[R_PC] = regs->ea;
    }
#elif defined(TARGET_OPENRISC)
    {
        int i;
+329 −0
Original line number Diff line number Diff line
#define TARGET_NR_io_setup                  0
#define TARGET_NR_io_destroy                1
#define TARGET_NR_io_submit                 2
#define TARGET_NR_io_cancel                 3
#define TARGET_NR_io_getevents              4
#define TARGET_NR_setxattr                  5
#define TARGET_NR_lsetxattr                 6
#define TARGET_NR_fsetxattr                 7
#define TARGET_NR_getxattr                  8
#define TARGET_NR_lgetxattr                 9
#define TARGET_NR_fgetxattr                 10
#define TARGET_NR_listxattr                 11
#define TARGET_NR_llistxattr                12
#define TARGET_NR_flistxattr                13
#define TARGET_NR_removexattr               14
#define TARGET_NR_lremovexattr              15
#define TARGET_NR_fremovexattr              16
#define TARGET_NR_getcwd                    17
#define TARGET_NR_lookup_dcookie            18
#define TARGET_NR_eventfd2                  19
#define TARGET_NR_epoll_create1             20
#define TARGET_NR_epoll_ctl                 21
#define TARGET_NR_epoll_pwait               22
#define TARGET_NR_dup                       23
#define TARGET_NR_dup3                      24
#define TARGET_NR_fcntl64                   25
#define TARGET_NR_inotify_init1             26
#define TARGET_NR_inotify_add_watch         27
#define TARGET_NR_inotify_rm_watch          28
#define TARGET_NR_ioctl                     29
#define TARGET_NR_ioprio_set                30
#define TARGET_NR_ioprio_get                31
#define TARGET_NR_flock                     32
#define TARGET_NR_mknodat                   33
#define TARGET_NR_mkdirat                   34
#define TARGET_NR_unlinkat                  35
#define TARGET_NR_symlinkat                 36
#define TARGET_NR_linkat                    37
#define TARGET_NR_renameat                  38
#define TARGET_NR_umount2                   39
#define TARGET_NR_mount                     40
#define TARGET_NR_pivot_root                41
#define TARGET_NR_nfsservctl                42
#define TARGET_NR_statfs64                  43
#define TARGET_NR_fstatfs64                 44
#define TARGET_NR_truncate64                45
#define TARGET_NR_ftruncate64               46
#define TARGET_NR_fallocate                 47
#define TARGET_NR_faccessat                 48
#define TARGET_NR_chdir                     49
#define TARGET_NR_fchdir                    50
#define TARGET_NR_chroot                    51
#define TARGET_NR_fchmod                    52
#define TARGET_NR_fchmodat                  53
#define TARGET_NR_fchownat                  54
#define TARGET_NR_fchown                    55
#define TARGET_NR_openat                    56
#define TARGET_NR_close                     57
#define TARGET_NR_vhangup                   58
#define TARGET_NR_pipe2                     59
#define TARGET_NR_quotactl                  60
#define TARGET_NR_getdents64                61
#define TARGET_NR_read                      63
#define TARGET_NR_write                     64
#define TARGET_NR_readv                     65
#define TARGET_NR_writev                    66
#define TARGET_NR_pread64                   67
#define TARGET_NR_pwrite64                  68
#define TARGET_NR_preadv                    69
#define TARGET_NR_pwritev                   70
#define TARGET_NR_sendfile64                71
#define TARGET_NR_pselect6                  72
#define TARGET_NR_ppoll                     73
#define TARGET_NR_signalfd4                 74
#define TARGET_NR_vmsplice                  75
#define TARGET_NR_splice                    76
#define TARGET_NR_tee                       77
#define TARGET_NR_readlinkat                78
#define TARGET_NR_fstatat64                 79
#define TARGET_NR_fstat64                   80
#define TARGET_NR_sync                      81
#define TARGET_NR_fsync                     82
#define TARGET_NR_fdatasync                 83
#define TARGET_NR_sync_file_range           84
#define TARGET_NR_timerfd_create            85
#define TARGET_NR_timerfd_settime           86
#define TARGET_NR_timerfd_gettime           87
#define TARGET_NR_utimensat                 88
#define TARGET_NR_acct                      89
#define TARGET_NR_capget                    90
#define TARGET_NR_capset                    91
#define TARGET_NR_personality               92
#define TARGET_NR_exit                      93
#define TARGET_NR_exit_group                94
#define TARGET_NR_waitid                    95
#define TARGET_NR_set_tid_address           96
#define TARGET_NR_unshare                   97
#define TARGET_NR_futex                     98
#define TARGET_NR_set_robust_list           99
#define TARGET_NR_get_robust_list           100
#define TARGET_NR_nanosleep                 101
#define TARGET_NR_getitimer                 102
#define TARGET_NR_setitimer                 103
#define TARGET_NR_kexec_load                104
#define TARGET_NR_init_module               105
#define TARGET_NR_delete_module             106
#define TARGET_NR_timer_create              107
#define TARGET_NR_timer_gettime             108
#define TARGET_NR_timer_getoverrun          109
#define TARGET_NR_timer_settime             110
#define TARGET_NR_timer_delete              111
#define TARGET_NR_clock_settime             112
#define TARGET_NR_clock_gettime             113
#define TARGET_NR_clock_getres              114
#define TARGET_NR_clock_nanosleep           115
#define TARGET_NR_syslog                    116
#define TARGET_NR_ptrace                    117
#define TARGET_NR_sched_setparam            118
#define TARGET_NR_sched_setscheduler        119
#define TARGET_NR_sched_getscheduler        120
#define TARGET_NR_sched_getparam            121
#define TARGET_NR_sched_setaffinity         122
#define TARGET_NR_sched_getaffinity         123
#define TARGET_NR_sched_yield               124
#define TARGET_NR_sched_get_priority_max    125
#define TARGET_NR_sched_get_priority_min    126
#define TARGET_NR_sched_rr_get_interval     127
#define TARGET_NR_restart_syscall           128
#define TARGET_NR_kill                      129
#define TARGET_NR_tkill                     130
#define TARGET_NR_tgkill                    131
#define TARGET_NR_sigaltstack               132
#define TARGET_NR_rt_sigsuspend             133
#define TARGET_NR_rt_sigaction              134
#define TARGET_NR_rt_sigprocmask            135
#define TARGET_NR_rt_sigpending             136
#define TARGET_NR_rt_sigtimedwait           137
#define TARGET_NR_rt_sigqueueinfo           138
#define TARGET_NR_rt_sigreturn              139
#define TARGET_NR_setpriority               140
#define TARGET_NR_getpriority               141
#define TARGET_NR_reboot                    142
#define TARGET_NR_setregid                  143
#define TARGET_NR_setgid                    144
#define TARGET_NR_setreuid                  145
#define TARGET_NR_setuid                    146
#define TARGET_NR_setresuid                 147
#define TARGET_NR_getresuid                 148
#define TARGET_NR_setresgid                 149
#define TARGET_NR_getresgid                 150
#define TARGET_NR_setfsuid                  151
#define TARGET_NR_setfsgid                  152
#define TARGET_NR_times                     153
#define TARGET_NR_setpgid                   154
#define TARGET_NR_getpgid                   155
#define TARGET_NR_getsid                    156
#define TARGET_NR_setsid                    157
#define TARGET_NR_getgroups                 158
#define TARGET_NR_setgroups                 159
#define TARGET_NR_uname                     160
#define TARGET_NR_sethostname               161
#define TARGET_NR_setdomainname             162
#define TARGET_NR_getrlimit                 163
#define TARGET_NR_setrlimit                 164
#define TARGET_NR_getrusage                 165
#define TARGET_NR_umask                     166
#define TARGET_NR_prctl                     167
#define TARGET_NR_getcpu                    168
#define TARGET_NR_gettimeofday              169
#define TARGET_NR_settimeofday              170
#define TARGET_NR_adjtimex                  171
#define TARGET_NR_getpid                    172
#define TARGET_NR_getppid                   173
#define TARGET_NR_getuid                    174
#define TARGET_NR_geteuid                   175
#define TARGET_NR_getgid                    176
#define TARGET_NR_getegid                   177
#define TARGET_NR_gettid                    178
#define TARGET_NR_sysinfo                   179
#define TARGET_NR_mq_open                   180
#define TARGET_NR_mq_unlink                 181
#define TARGET_NR_mq_timedsend              182
#define TARGET_NR_mq_timedreceive           183
#define TARGET_NR_mq_notify                 184
#define TARGET_NR_mq_getsetattr             185
#define TARGET_NR_msgget                    186
#define TARGET_NR_msgctl                    187
#define TARGET_NR_msgrcv                    188
#define TARGET_NR_msgsnd                    189
#define TARGET_NR_semget                    190
#define TARGET_NR_semctl                    191
#define TARGET_NR_semtimedop                192
#define TARGET_NR_semop                     193
#define TARGET_NR_shmget                    194
#define TARGET_NR_shmctl                    195
#define TARGET_NR_shmat                     196
#define TARGET_NR_shmdt                     197
#define TARGET_NR_socket                    198
#define TARGET_NR_socketpair                199
#define TARGET_NR_bind                      200
#define TARGET_NR_listen                    201
#define TARGET_NR_accept                    202
#define TARGET_NR_connect                   203
#define TARGET_NR_getsockname               204
#define TARGET_NR_getpeername               205
#define TARGET_NR_sendto                    206
#define TARGET_NR_recvfrom                  207
#define TARGET_NR_setsockopt                208
#define TARGET_NR_getsockopt                209
#define TARGET_NR_shutdown                  210
#define TARGET_NR_sendmsg                   211
#define TARGET_NR_recvmsg                   212
#define TARGET_NR_readahead                 213
#define TARGET_NR_brk                       214
#define TARGET_NR_munmap                    215
#define TARGET_NR_mremap                    216
#define TARGET_NR_add_key                   217
#define TARGET_NR_request_key               218
#define TARGET_NR_keyctl                    219
#define TARGET_NR_clone                     220
#define TARGET_NR_execve                    221
#define TARGET_NR_mmap2                     222
#define TARGET_NR_fadvise64_64              223
#define TARGET_NR_swapon                    224
#define TARGET_NR_swapoff                   225
#define TARGET_NR_mprotect                  226
#define TARGET_NR_msync                     227
#define TARGET_NR_mlock                     228
#define TARGET_NR_munlock                   229
#define TARGET_NR_mlockall                  230
#define TARGET_NR_munlockall                231
#define TARGET_NR_mincore                   232
#define TARGET_NR_madvise                   233
#define TARGET_NR_remap_file_pages          234
#define TARGET_NR_mbind                     235
#define TARGET_NR_get_mempolicy             236
#define TARGET_NR_set_mempolicy             237
#define TARGET_NR_migrate_pages             238
#define TARGET_NR_move_pages                239
#define TARGET_NR_rt_tgsigqueueinfo         240
#define TARGET_NR_perf_event_open           241
#define TARGET_NR_accept4                   242
#define TARGET_NR_recvmmsg                  243
#define TARGET_NR_cacheflush                244
#define TARGET_NR_arch_specific_syscall     244
#define TARGET_NR_wait4                     260
#define TARGET_NR_prlimit64                 261
#define TARGET_NR_fanotify_init             262
#define TARGET_NR_fanotify_mark             263
#define TARGET_NR_name_to_handle_at         264
#define TARGET_NR_open_by_handle_at         265
#define TARGET_NR_clock_adjtime             266
#define TARGET_NR_syncfs                    267
#define TARGET_NR_setns                     268
#define TARGET_NR_sendmmsg                  269
#define TARGET_NR_process_vm_readv          270
#define TARGET_NR_process_vm_writev         271
#define TARGET_NR_kcmp                      272
#define TARGET_NR_finit_module              273
#define TARGET_NR_sched_setattr             274
#define TARGET_NR_sched_getattr             275
#define TARGET_NR_renameat2                 276
#define TARGET_NR_seccomp                   277
#define TARGET_NR_getrandom                 278
#define TARGET_NR_memfd_create              279
#define TARGET_NR_bpf                       280
#define TARGET_NR_execveat                  281
#define TARGET_NR_userfaultfd               282
#define TARGET_NR_membarrier                283
#define TARGET_NR_mlock2                    284
#define TARGET_NR_copy_file_range           285
#define TARGET_NR_preadv2                   286
#define TARGET_NR_pwritev2                  287
#define TARGET_NR_open                      1024
#define TARGET_NR_link                      1025
#define TARGET_NR_unlink                    1026
#define TARGET_NR_mknod                     1027
#define TARGET_NR_chmod                     1028
#define TARGET_NR_chown                     1029
#define TARGET_NR_mkdir                     1030
#define TARGET_NR_rmdir                     1031
#define TARGET_NR_lchown                    1032
#define TARGET_NR_access                    1033
#define TARGET_NR_rename                    1034
#define TARGET_NR_readlink                  1035
#define TARGET_NR_symlink                   1036
#define TARGET_NR_utimes                    1037
#define TARGET_NR_3264_stat                 1038
#define TARGET_NR_3264_lstat                1039
#define TARGET_NR_pipe                      1040
#define TARGET_NR_dup2                      1041
#define TARGET_NR_epoll_create              1042
#define TARGET_NR_inotify_init              1043
#define TARGET_NR_eventfd                   1044
#define TARGET_NR_signalfd                  1045
#define TARGET_NR_sendfile                  1046
#define TARGET_NR_ftruncate                 1047
#define TARGET_NR_truncate                  1048
#define TARGET_NR_stat                      1049
#define TARGET_NR_lstat                     1050
#define TARGET_NR_fstat                     1051
#define TARGET_NR_fcntl                     1052
#define TARGET_NR_fadvise64                 1053
#define TARGET_NR_newfstatat                1054
#define TARGET_NR_fstatfs                   1055
#define TARGET_NR_statfs                    1056
#define TARGET_NR_lseek                     1057
#define TARGET_NR_mmap                      1058
#define TARGET_NR_alarm                     1059
#define TARGET_NR_getpgrp                   1060
#define TARGET_NR_pause                     1061
#define TARGET_NR_time                      1062
#define TARGET_NR_utime                     1063
#define TARGET_NR_creat                     1064
#define TARGET_NR_getdents                  1065
#define TARGET_NR_futimesat                 1066
#define TARGET_NR_select                    1067
#define TARGET_NR_poll                      1068
#define TARGET_NR_epoll_wait                1069
#define TARGET_NR_ustat                     1070
#define TARGET_NR_vfork                     1071
#define TARGET_NR_oldwait4                  1072
#define TARGET_NR_recv                      1073
#define TARGET_NR_send                      1074
#define TARGET_NR_bdflush                   1075
#define TARGET_NR_umount                    1076
#define TARGET_NR_uselib                    1077
#define TARGET_NR__sysctl                   1078
#define TARGET_NR_fork                      1079
+39 −0
Original line number Diff line number Diff line
/*
 * Nios2 specific CPU ABI and functions for linux-user
 *
 * Copyright (c) 2016 Marek Vasut <marex@denx.de>
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, see <http://www.gnu.org/licenses/>.
 */

#ifndef TARGET_CPU_H
#define TARGET_CPU_H

static inline void cpu_clone_regs(CPUNios2State *env, target_ulong newsp)
{
    if (newsp) {
        env->regs[R_SP] = newsp;
    }
    env->regs[R_RET0] = 0;
}

static inline void cpu_set_tls(CPUNios2State *env, target_ulong newtls)
{
    /*
     * Linux kernel 3.10 does not pay any attention to CLONE_SETTLS
     * in copy_thread(), so QEMU need not do so either.
     */
}

#endif
Loading