Annotation of qemu/linux-user/qemu.h, revision 1.1

1.1     ! root        1: #ifndef QEMU_H
        !             2: #define QEMU_H
        !             3: 
        !             4: #include "thunk.h"
        !             5: 
        !             6: #include <signal.h>
        !             7: #include <string.h>
        !             8: #include "syscall_defs.h"
        !             9: 
        !            10: #include "cpu.h"
        !            11: #include "syscall.h"
        !            12: #include "gdbstub.h"
        !            13: 
        !            14: /* This struct is used to hold certain information about the image.
        !            15:  * Basically, it replicates in user space what would be certain
        !            16:  * task_struct fields in the kernel
        !            17:  */
        !            18: struct image_info {
        !            19:        unsigned long   start_code;
        !            20:        unsigned long   end_code;
        !            21:        unsigned long   end_data;
        !            22:        unsigned long   start_brk;
        !            23:        unsigned long   brk;
        !            24:        unsigned long   start_mmap;
        !            25:        unsigned long   mmap;
        !            26:        unsigned long   rss;
        !            27:        unsigned long   start_stack;
        !            28:        unsigned long   arg_start;
        !            29:        unsigned long   arg_end;
        !            30:        unsigned long   env_start;
        !            31:        unsigned long   env_end;
        !            32:        unsigned long   entry;
        !            33:        int             personality;
        !            34: };
        !            35: 
        !            36: #ifdef TARGET_I386
        !            37: /* Information about the current linux thread */
        !            38: struct vm86_saved_state {
        !            39:     uint32_t eax; /* return code */
        !            40:     uint32_t ebx;
        !            41:     uint32_t ecx;
        !            42:     uint32_t edx;
        !            43:     uint32_t esi;
        !            44:     uint32_t edi;
        !            45:     uint32_t ebp;
        !            46:     uint32_t esp;
        !            47:     uint32_t eflags;
        !            48:     uint32_t eip;
        !            49:     uint16_t cs, ss, ds, es, fs, gs;
        !            50: };
        !            51: #endif
        !            52: 
        !            53: #ifdef TARGET_ARM
        !            54: /* FPU emulator */
        !            55: #include "nwfpe/fpa11.h"
        !            56: #endif
        !            57: 
        !            58: /* NOTE: we force a big alignment so that the stack stored after is
        !            59:    aligned too */
        !            60: typedef struct TaskState {
        !            61:     struct TaskState *next;
        !            62: #ifdef TARGET_ARM
        !            63:     /* FPA state */
        !            64:     FPA11 fpa;
        !            65:     /* Extra fields for semihosted binaries.  */
        !            66:     uint32_t stack_base;
        !            67:     uint32_t heap_base;
        !            68:     uint32_t heap_limit;
        !            69:     int swi_errno;
        !            70: #endif
        !            71: #ifdef TARGET_I386
        !            72:     struct target_vm86plus_struct *target_v86;
        !            73:     struct vm86_saved_state vm86_saved_regs;
        !            74:     struct target_vm86plus_struct vm86plus;
        !            75:     uint32_t v86flags;
        !            76:     uint32_t v86mask;
        !            77: #endif
        !            78:     int used; /* non zero if used */
        !            79:     uint8_t stack[0];
        !            80: } __attribute__((aligned(16))) TaskState;
        !            81: 
        !            82: extern TaskState *first_task_state;
        !            83: 
        !            84: int elf_exec(const char * filename, char ** argv, char ** envp, 
        !            85:              struct target_pt_regs * regs, struct image_info *infop);
        !            86: 
        !            87: void target_set_brk(char *new_brk);
        !            88: long do_brk(char *new_brk);
        !            89: void syscall_init(void);
        !            90: long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, 
        !            91:                 long arg4, long arg5, long arg6);
        !            92: void gemu_log(const char *fmt, ...) __attribute__((format(printf,1,2)));
        !            93: extern CPUState *global_env;
        !            94: void cpu_loop(CPUState *env);
        !            95: void init_paths(const char *prefix);
        !            96: const char *path(const char *pathname);
        !            97: 
        !            98: extern int loglevel;
        !            99: extern FILE *logfile;
        !           100: 
        !           101: /* signal.c */
        !           102: void process_pending_signals(void *cpu_env);
        !           103: void signal_init(void);
        !           104: int queue_signal(int sig, target_siginfo_t *info);
        !           105: void host_to_target_siginfo(target_siginfo_t *tinfo, const siginfo_t *info);
        !           106: void target_to_host_siginfo(siginfo_t *info, const target_siginfo_t *tinfo);
        !           107: long do_sigreturn(CPUState *env);
        !           108: long do_rt_sigreturn(CPUState *env);
        !           109: 
        !           110: #ifdef TARGET_I386
        !           111: /* vm86.c */
        !           112: void save_v86_state(CPUX86State *env);
        !           113: void handle_vm86_trap(CPUX86State *env, int trapno);
        !           114: void handle_vm86_fault(CPUX86State *env);
        !           115: int do_vm86(CPUX86State *env, long subfunction, 
        !           116:             struct target_vm86plus_struct * target_v86);
        !           117: #endif
        !           118: 
        !           119: /* mmap.c */
        !           120: int target_mprotect(unsigned long start, unsigned long len, int prot);
        !           121: long target_mmap(unsigned long start, unsigned long len, int prot, 
        !           122:                  int flags, int fd, unsigned long offset);
        !           123: int target_munmap(unsigned long start, unsigned long len);
        !           124: long target_mremap(unsigned long old_addr, unsigned long old_size, 
        !           125:                    unsigned long new_size, unsigned long flags,
        !           126:                    unsigned long new_addr);
        !           127: int target_msync(unsigned long start, unsigned long len, int flags);
        !           128: 
        !           129: /* user access */
        !           130: 
        !           131: #define VERIFY_READ 0
        !           132: #define VERIFY_WRITE 1
        !           133: 
        !           134: #define access_ok(type,addr,size) (1)
        !           135: 
        !           136: #define __put_user(x,ptr)\
        !           137: ({\
        !           138:     int size = sizeof(*ptr);\
        !           139:     switch(size) {\
        !           140:     case 1:\
        !           141:         stb(ptr, (typeof(*ptr))(x));\
        !           142:         break;\
        !           143:     case 2:\
        !           144:         stw(ptr, (typeof(*ptr))(x));\
        !           145:         break;\
        !           146:     case 4:\
        !           147:         stl(ptr, (typeof(*ptr))(x));\
        !           148:         break;\
        !           149:     case 8:\
        !           150:         stq(ptr, (typeof(*ptr))(x));\
        !           151:         break;\
        !           152:     default:\
        !           153:         abort();\
        !           154:     }\
        !           155:     0;\
        !           156: })
        !           157: 
        !           158: #define __get_user(x, ptr) \
        !           159: ({\
        !           160:     int size = sizeof(*ptr);\
        !           161:     switch(size) {\
        !           162:     case 1:\
        !           163:         x = (typeof(*ptr))ldub((void *)ptr);\
        !           164:         break;\
        !           165:     case 2:\
        !           166:         x = (typeof(*ptr))lduw((void *)ptr);\
        !           167:         break;\
        !           168:     case 4:\
        !           169:         x = (typeof(*ptr))ldl((void *)ptr);\
        !           170:         break;\
        !           171:     case 8:\
        !           172:         x = (typeof(*ptr))ldq((void *)ptr);\
        !           173:         break;\
        !           174:     default:\
        !           175:         abort();\
        !           176:     }\
        !           177:     0;\
        !           178: })
        !           179: 
        !           180: static inline unsigned long __copy_to_user(void *dst, const void *src, 
        !           181:                                            unsigned long size)
        !           182: {
        !           183:     memcpy(dst, src, size);
        !           184:     return 0;
        !           185: }
        !           186: 
        !           187: static inline unsigned long __copy_from_user(void *dst, const void *src, 
        !           188:                                              unsigned long size)
        !           189: {
        !           190:     memcpy(dst, src, size);
        !           191:     return 0;
        !           192: }
        !           193: 
        !           194: static inline unsigned long __clear_user(void *dst, unsigned long size)
        !           195: {
        !           196:     memset(dst, 0, size);
        !           197:     return 0;
        !           198: }
        !           199: 
        !           200: #define put_user(x,ptr)\
        !           201: ({\
        !           202:     int __ret;\
        !           203:     if (access_ok(VERIFY_WRITE, ptr, sizeof(*ptr)))\
        !           204:         __ret = __put_user(x, ptr);\
        !           205:     else\
        !           206:         __ret = -EFAULT;\
        !           207:     __ret;\
        !           208: })
        !           209: 
        !           210: #define get_user(x,ptr)\
        !           211: ({\
        !           212:     int __ret;\
        !           213:     if (access_ok(VERIFY_READ, ptr, sizeof(*ptr)))\
        !           214:         __ret = __get_user(x, ptr);\
        !           215:     else\
        !           216:         __ret = -EFAULT;\
        !           217:     __ret;\
        !           218: })
        !           219: 
        !           220: static inline unsigned long copy_to_user(void *dst, const void *src, 
        !           221:                                          unsigned long size)
        !           222: {
        !           223:     if (access_ok(VERIFY_WRITE, dst, size))
        !           224:         return __copy_to_user(dst, src, size);
        !           225:     else
        !           226:         return size;
        !           227: }
        !           228: 
        !           229: static inline unsigned long copy_from_user(void *dst, const void *src, 
        !           230:                                              unsigned long size)
        !           231: {
        !           232:     if (access_ok(VERIFY_READ, src, size))
        !           233:         return __copy_from_user(dst, src, size);
        !           234:     else
        !           235:         return size;
        !           236: }
        !           237: 
        !           238: static inline unsigned long clear_user(void *dst, unsigned long size)
        !           239: {
        !           240:     if (access_ok(VERIFY_WRITE, dst, size))
        !           241:         return __clear_user(dst, size);
        !           242:     else
        !           243:         return size;
        !           244: }
        !           245: 
        !           246: #endif /* QEMU_H */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.