Commit fa2948167f9dadfe9fd079f1e278742efae4d89f
1 parent
b49d07ba
sem* and msg* for qemu, part1, by Kirill Shutemov.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2382 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
24 additions
and
0 deletions
linux-user/syscall.c
| ... | ... | @@ -42,6 +42,7 @@ |
| 42 | 42 | #include <sys/poll.h> |
| 43 | 43 | #include <sys/times.h> |
| 44 | 44 | #include <sys/shm.h> |
| 45 | +#include <sys/sem.h> | |
| 45 | 46 | #include <sys/statfs.h> |
| 46 | 47 | #include <utime.h> |
| 47 | 48 | #include <sys/sysinfo.h> |
| ... | ... | @@ -1114,6 +1115,12 @@ static struct shm_region { |
| 1114 | 1115 | uint32_t size; |
| 1115 | 1116 | } shm_regions[N_SHM_REGIONS]; |
| 1116 | 1117 | |
| 1118 | +union semun { | |
| 1119 | + int val; | |
| 1120 | + struct senid_ds *buf; | |
| 1121 | + unsigned short *array; | |
| 1122 | +}; | |
| 1123 | + | |
| 1117 | 1124 | /* ??? This only works with linear mappings. */ |
| 1118 | 1125 | static long do_ipc(long call, long first, long second, long third, |
| 1119 | 1126 | long ptr, long fifth) |
| ... | ... | @@ -1128,6 +1135,23 @@ static long do_ipc(long call, long first, long second, long third, |
| 1128 | 1135 | call &= 0xffff; |
| 1129 | 1136 | |
| 1130 | 1137 | switch (call) { |
| 1138 | + case IPCOP_semop: | |
| 1139 | + ret = get_errno(semop(first,(struct sembuf *) ptr, second)); | |
| 1140 | + break; | |
| 1141 | + | |
| 1142 | + case IPCOP_semget: | |
| 1143 | + ret = get_errno(semget(first, second, third)); | |
| 1144 | + break; | |
| 1145 | + | |
| 1146 | + case IPCOP_semctl: | |
| 1147 | + ret = get_errno(semctl(first, second, third, ((union semun*)ptr)->val)); | |
| 1148 | + | |
| 1149 | + break; | |
| 1150 | + | |
| 1151 | + case IPCOP_semtimedop: | |
| 1152 | + gemu_log("Unsupported ipc call: %ld (version %d)\n", call, version); | |
| 1153 | + ret = -ENOSYS; | |
| 1154 | + break; | |
| 1131 | 1155 | case IPCOP_shmat: |
| 1132 | 1156 | /* SHM_* flags are the same on all linux platforms */ |
| 1133 | 1157 | ret = get_errno((long) shmat(first, (void *) ptr, second)); | ... | ... |