Revision 1b6b029e linux-user/main.c

b/linux-user/main.c
104 104

  
105 105
uint64_t gdt_table[6];
106 106

  
107
void cpu_loop(struct CPUX86State *env)
108
{
109
    for(;;) {
110
        int err;
111
        uint8_t *pc;
112
        
113
        err = cpu_x86_exec(env);
114
        pc = env->seg_cache[R_CS].base + env->eip;
115
        switch(err) {
116
        case EXCP0D_GPF:
117
            if (pc[0] == 0xcd && pc[1] == 0x80) {
118
                /* syscall */
119
                env->eip += 2;
120
                env->regs[R_EAX] = do_syscall(env, 
121
                                              env->regs[R_EAX], 
122
                                              env->regs[R_EBX],
123
                                              env->regs[R_ECX],
124
                                              env->regs[R_EDX],
125
                                              env->regs[R_ESI],
126
                                              env->regs[R_EDI],
127
                                              env->regs[R_EBP]);
128
            } else {
129
                goto trap_error;
130
            }
131
            break;
132
        default:
133
        trap_error:
134
            fprintf(stderr, "0x%08lx: Unknown exception %d, aborting\n", 
135
                    (long)pc, err);
136
            abort();
137
        }
138
    }
139
}
140

  
107 141
void usage(void)
108 142
{
109 143
    printf("gemu version " GEMU_VERSION ", Copyright (c) 2003 Fabrice Bellard\n"
......
113 147
    exit(1);
114 148
}
115 149

  
116

  
117

  
118 150
int main(int argc, char **argv)
119 151
{
120 152
    const char *filename;
......
193 225
    cpu_x86_load_seg(env, R_FS, __USER_DS);
194 226
    cpu_x86_load_seg(env, R_GS, __USER_DS);
195 227

  
196
    for(;;) {
197
        int err;
198
        uint8_t *pc;
199
        
200
        err = cpu_x86_exec(env);
201
        pc = env->seg_cache[R_CS].base + env->eip;
202
        switch(err) {
203
        case EXCP0D_GPF:
204
            if (pc[0] == 0xcd && pc[1] == 0x80) {
205
                /* syscall */
206
                env->eip += 2;
207
                env->regs[R_EAX] = do_syscall(env, 
208
                                              env->regs[R_EAX], 
209
                                              env->regs[R_EBX],
210
                                              env->regs[R_ECX],
211
                                              env->regs[R_EDX],
212
                                              env->regs[R_ESI],
213
                                              env->regs[R_EDI],
214
                                              env->regs[R_EBP]);
215
            } else {
216
                goto trap_error;
217
            }
218
            break;
219
        default:
220
        trap_error:
221
            fprintf(stderr, "0x%08lx: Unknown exception %d, aborting\n", 
222
                    (long)pc, err);
223
            abort();
224
        }
225
    }
228
    cpu_loop(env);
229
    /* never exits */
226 230
    return 0;
227 231
}

Also available in: Unified diff