Commit 631271d7164f8209c044988b6a02e1153391c4f9

Authored by bellard
1 parent 9d27abd9

added vm86.c


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@143 c046a42c-6fe2-441c-8c8c-71466251a162
linux-user/qemu.h
@@ -54,6 +54,8 @@ typedef struct TaskState { @@ -54,6 +54,8 @@ typedef struct TaskState {
54 struct TaskState *next; 54 struct TaskState *next;
55 struct target_vm86plus_struct *target_v86; 55 struct target_vm86plus_struct *target_v86;
56 struct vm86_saved_state vm86_saved_regs; 56 struct vm86_saved_state vm86_saved_regs;
  57 + uint32_t v86flags;
  58 + uint32_t v86mask;
57 int used; /* non zero if used */ 59 int used; /* non zero if used */
58 uint8_t stack[0]; 60 uint8_t stack[0];
59 } __attribute__((aligned(16))) TaskState; 61 } __attribute__((aligned(16))) TaskState;
@@ -73,9 +75,17 @@ void cpu_loop(CPUX86State *env); @@ -73,9 +75,17 @@ void cpu_loop(CPUX86State *env);
73 void process_pending_signals(void *cpu_env); 75 void process_pending_signals(void *cpu_env);
74 void signal_init(void); 76 void signal_init(void);
75 int queue_signal(int sig, target_siginfo_t *info); 77 int queue_signal(int sig, target_siginfo_t *info);
76 -void save_v86_state(CPUX86State *env);  
77 void init_paths(const char *prefix); 78 void init_paths(const char *prefix);
78 const char *path(const char *pathname); 79 const char *path(const char *pathname);
79 80
80 extern int loglevel; 81 extern int loglevel;
  82 +extern FILE *logfile;
  83 +
  84 +/* vm86.c */
  85 +void save_v86_state(CPUX86State *env);
  86 +void do_int(CPUX86State *env, int intno);
  87 +void handle_vm86_fault(CPUX86State *env);
  88 +int do_vm86(CPUX86State *env, long subfunction,
  89 + struct target_vm86plus_struct * target_v86);
  90 +
81 #endif 91 #endif
linux-user/syscall.c
@@ -1058,78 +1058,6 @@ int do_modify_ldt(CPUX86State *env, int func, void *ptr, unsigned long bytecount @@ -1058,78 +1058,6 @@ int do_modify_ldt(CPUX86State *env, int func, void *ptr, unsigned long bytecount
1058 return ret; 1058 return ret;
1059 } 1059 }
1060 1060
1061 -/* vm86 emulation */  
1062 -  
1063 -#define SAFE_MASK (0xDD5)  
1064 -  
1065 -int do_vm86(CPUX86State *env, long subfunction,  
1066 - struct target_vm86plus_struct * target_v86)  
1067 -{  
1068 - TaskState *ts = env->opaque;  
1069 - int ret;  
1070 -  
1071 - switch (subfunction) {  
1072 - case TARGET_VM86_REQUEST_IRQ:  
1073 - case TARGET_VM86_FREE_IRQ:  
1074 - case TARGET_VM86_GET_IRQ_BITS:  
1075 - case TARGET_VM86_GET_AND_RESET_IRQ:  
1076 - gemu_log("qemu: unsupported vm86 subfunction (%ld)\n", subfunction);  
1077 - ret = -EINVAL;  
1078 - goto out;  
1079 - case TARGET_VM86_PLUS_INSTALL_CHECK:  
1080 - /* NOTE: on old vm86 stuff this will return the error  
1081 - from verify_area(), because the subfunction is  
1082 - interpreted as (invalid) address to vm86_struct.  
1083 - So the installation check works.  
1084 - */  
1085 - ret = 0;  
1086 - goto out;  
1087 - }  
1088 -  
1089 - ts->target_v86 = target_v86;  
1090 - /* save current CPU regs */  
1091 - ts->vm86_saved_regs.eax = 0; /* default vm86 syscall return code */  
1092 - ts->vm86_saved_regs.ebx = env->regs[R_EBX];  
1093 - ts->vm86_saved_regs.ecx = env->regs[R_ECX];  
1094 - ts->vm86_saved_regs.edx = env->regs[R_EDX];  
1095 - ts->vm86_saved_regs.esi = env->regs[R_ESI];  
1096 - ts->vm86_saved_regs.edi = env->regs[R_EDI];  
1097 - ts->vm86_saved_regs.ebp = env->regs[R_EBP];  
1098 - ts->vm86_saved_regs.esp = env->regs[R_ESP];  
1099 - ts->vm86_saved_regs.eflags = env->eflags;  
1100 - ts->vm86_saved_regs.eip = env->eip;  
1101 - ts->vm86_saved_regs.cs = env->segs[R_CS];  
1102 - ts->vm86_saved_regs.ss = env->segs[R_SS];  
1103 - ts->vm86_saved_regs.ds = env->segs[R_DS];  
1104 - ts->vm86_saved_regs.es = env->segs[R_ES];  
1105 - ts->vm86_saved_regs.fs = env->segs[R_FS];  
1106 - ts->vm86_saved_regs.gs = env->segs[R_GS];  
1107 -  
1108 - /* build vm86 CPU state */  
1109 - env->eflags = (env->eflags & ~SAFE_MASK) |  
1110 - (tswap32(target_v86->regs.eflags) & SAFE_MASK) | VM_MASK;  
1111 -  
1112 - env->regs[R_EBX] = tswap32(target_v86->regs.ebx);  
1113 - env->regs[R_ECX] = tswap32(target_v86->regs.ecx);  
1114 - env->regs[R_EDX] = tswap32(target_v86->regs.edx);  
1115 - env->regs[R_ESI] = tswap32(target_v86->regs.esi);  
1116 - env->regs[R_EDI] = tswap32(target_v86->regs.edi);  
1117 - env->regs[R_EBP] = tswap32(target_v86->regs.ebp);  
1118 - env->regs[R_ESP] = tswap32(target_v86->regs.esp);  
1119 - env->eip = tswap32(target_v86->regs.eip);  
1120 - cpu_x86_load_seg(env, R_CS, tswap16(target_v86->regs.cs));  
1121 - cpu_x86_load_seg(env, R_SS, tswap16(target_v86->regs.ss));  
1122 - cpu_x86_load_seg(env, R_DS, tswap16(target_v86->regs.ds));  
1123 - cpu_x86_load_seg(env, R_ES, tswap16(target_v86->regs.es));  
1124 - cpu_x86_load_seg(env, R_FS, tswap16(target_v86->regs.fs));  
1125 - cpu_x86_load_seg(env, R_GS, tswap16(target_v86->regs.gs));  
1126 - ret = tswap32(target_v86->regs.eax); /* eax will be restored at  
1127 - the end of the syscall */  
1128 - /* now the virtual CPU is ready for vm86 execution ! */  
1129 - out:  
1130 - return ret;  
1131 -}  
1132 -  
1133 /* this stack is the equivalent of the kernel stack associated with a 1061 /* this stack is the equivalent of the kernel stack associated with a
1134 thread/process */ 1062 thread/process */
1135 #define NEW_STACK_SIZE 8192 1063 #define NEW_STACK_SIZE 8192