Revision 3eb6b044

b/linux-user/alpha/syscall.h
38 38
        target_ulong unique;
39 39
};
40 40

  
41
#define TARGET_SEMOP           1
42
#define TARGET_SEMGET          2
43
#define TARGET_SEMCTL          3 
44
#define TARGET_MSGSND          11 
45
#define TARGET_MSGRCV          12
46
#define TARGET_MSGGET          13
47
#define TARGET_MSGCTL          14
48
#define TARGET_SHMAT           21
49
#define TARGET_SHMDT           22
50
#define TARGET_SHMGET          23
51
#define TARGET_SHMCTL          24
52

  
53
struct target_msgbuf {
54
	int mtype;
55
	char mtext[1];
56
};
57

  
58
struct target_ipc_kludge {
59
	unsigned int	msgp;	/* Really (struct msgbuf *) */
60
	int msgtyp;
61
};	
62

  
63
struct target_ipc_perm {
64
	int	key;
65
	unsigned short	uid;
66
	unsigned short	gid;
67
	unsigned short	cuid;
68
	unsigned short	cgid;
69
	unsigned short	mode;
70
	unsigned short	seq;
71
};
72

  
73
struct target_msqid_ds {
74
	struct target_ipc_perm	msg_perm;
75
	unsigned int		msg_first;	/* really struct target_msg* */
76
	unsigned int		msg_last;	/* really struct target_msg* */
77
	unsigned int		msg_stime;	/* really target_time_t */
78
	unsigned int		msg_rtime;	/* really target_time_t */
79
	unsigned int		msg_ctime;	/* really target_time_t */
80
	unsigned int		wwait;		/* really struct wait_queue* */
81
	unsigned int		rwait;		/* really struct wait_queue* */
82
	unsigned short		msg_cbytes;
83
	unsigned short		msg_qnum;
84
	unsigned short		msg_qbytes;
85
	unsigned short		msg_lspid;
86
	unsigned short		msg_lrpid;
87
};
88

  
89
struct target_shmid_ds {
90
	struct target_ipc_perm	shm_perm;
91
	int			shm_segsz;
92
	unsigned int		shm_atime;	/* really target_time_t */
93
	unsigned int		shm_dtime;	/* really target_time_t */
94
	unsigned int		shm_ctime;	/* really target_time_t */
95
	unsigned short		shm_cpid;
96
	unsigned short		shm_lpid;
97
	short			shm_nattch;
98
	unsigned short		shm_npages;
99
	unsigned long		*shm_pages;
100
	void 			*attaches;	/* really struct shm_desc * */
101
};
102

  
103
#define TARGET_IPC_RMID	0
104
#define TARGET_IPC_SET	1
105
#define TARGET_IPC_STAT	2
106

  
107
union target_semun {
108
    int val;
109
    unsigned int buf;	/* really struct semid_ds * */
110
    unsigned int array; /* really unsigned short * */
111
    unsigned int __buf;	/* really struct seminfo * */
112
    unsigned int __pad;	/* really void* */
113
};
114

  
115 41
#define UNAME_MACHINE "alpha"
b/linux-user/i386/syscall.h
142 142
	struct target_vm86plus_info_struct vm86plus;
143 143
};
144 144

  
145
/* ipcs */
146

  
147
#define TARGET_SEMOP           1
148
#define TARGET_SEMGET          2
149
#define TARGET_SEMCTL          3 
150
#define TARGET_MSGSND          11 
151
#define TARGET_MSGRCV          12
152
#define TARGET_MSGGET          13
153
#define TARGET_MSGCTL          14
154
#define TARGET_SHMAT           21
155
#define TARGET_SHMDT           22
156
#define TARGET_SHMGET          23
157
#define TARGET_SHMCTL          24
158

  
159
struct target_msgbuf {
160
	int mtype;
161
	char mtext[1];
162
};
163

  
164
struct target_ipc_kludge {
165
	unsigned int	msgp;	/* Really (struct msgbuf *) */
166
	int msgtyp;
167
};	
168

  
169
struct target_ipc_perm {
170
	int	key;
171
	unsigned short	uid;
172
	unsigned short	gid;
173
	unsigned short	cuid;
174
	unsigned short	cgid;
175
	unsigned short	mode;
176
	unsigned short	seq;
177
};
178

  
179
struct target_msqid_ds {
180
	struct target_ipc_perm	msg_perm;
181
	unsigned int		msg_first;	/* really struct target_msg* */
182
	unsigned int		msg_last;	/* really struct target_msg* */
183
	unsigned int		msg_stime;	/* really target_time_t */
184
	unsigned int		msg_rtime;	/* really target_time_t */
185
	unsigned int		msg_ctime;	/* really target_time_t */
186
	unsigned int		wwait;		/* really struct wait_queue* */
187
	unsigned int		rwait;		/* really struct wait_queue* */
188
	unsigned short		msg_cbytes;
189
	unsigned short		msg_qnum;
190
	unsigned short		msg_qbytes;
191
	unsigned short		msg_lspid;
192
	unsigned short		msg_lrpid;
193
};
194

  
195
struct target_shmid_ds {
196
	struct target_ipc_perm	shm_perm;
197
	int			shm_segsz;
198
	unsigned int		shm_atime;	/* really target_time_t */
199
	unsigned int		shm_dtime;	/* really target_time_t */
200
	unsigned int		shm_ctime;	/* really target_time_t */
201
	unsigned short		shm_cpid;
202
	unsigned short		shm_lpid;
203
	short			shm_nattch;
204
	unsigned short		shm_npages;
205
	unsigned long		*shm_pages;
206
	void 			*attaches;	/* really struct shm_desc * */
207
};
208

  
209
#define TARGET_IPC_RMID	0
210
#define TARGET_IPC_SET	1
211
#define TARGET_IPC_STAT	2
212

  
213
union target_semun {
214
    int val;
215
    unsigned int buf;	/* really struct semid_ds * */
216
    unsigned int array; /* really unsigned short * */
217
    unsigned int __buf;	/* really struct seminfo * */
218
    unsigned int __pad;	/* really void* */
219
};
220

  
221 145
#define UNAME_MACHINE "i686"
b/linux-user/ppc/syscall.h
51 51
 * flags masks
52 52
 */
53 53

  
54
/* ipcs */
55

  
56
#define TARGET_SEMOP           1
57
#define TARGET_SEMGET          2
58
#define TARGET_SEMCTL          3 
59
#define TARGET_MSGSND          11 
60
#define TARGET_MSGRCV          12
61
#define TARGET_MSGGET          13
62
#define TARGET_MSGCTL          14
63
#define TARGET_SHMAT           21
64
#define TARGET_SHMDT           22
65
#define TARGET_SHMGET          23
66
#define TARGET_SHMCTL          24
67

  
68
struct target_msgbuf {
69
	int mtype;
70
	char mtext[1];
71
};
72

  
73
struct target_ipc_kludge {
74
	unsigned int	msgp;	/* Really (struct msgbuf *) */
75
	int msgtyp;
76
};	
77

  
78
struct target_ipc_perm {
79
	int	key;
80
	unsigned short	uid;
81
	unsigned short	gid;
82
	unsigned short	cuid;
83
	unsigned short	cgid;
84
	unsigned short	mode;
85
	unsigned short	seq;
86
};
87

  
88
struct target_msqid_ds {
89
	struct target_ipc_perm	msg_perm;
90
	unsigned int		msg_first;	/* really struct target_msg* */
91
	unsigned int		msg_last;	/* really struct target_msg* */
92
	unsigned int		msg_stime;	/* really target_time_t */
93
	unsigned int		msg_rtime;	/* really target_time_t */
94
	unsigned int		msg_ctime;	/* really target_time_t */
95
	unsigned int		wwait;		/* really struct wait_queue* */
96
	unsigned int		rwait;		/* really struct wait_queue* */
97
	unsigned short		msg_cbytes;
98
	unsigned short		msg_qnum;
99
	unsigned short		msg_qbytes;
100
	unsigned short		msg_lspid;
101
	unsigned short		msg_lrpid;
102
};
103

  
104
struct target_shmid_ds {
105
	struct target_ipc_perm	shm_perm;
106
	int			shm_segsz;
107
	unsigned int		shm_atime;	/* really target_time_t */
108
	unsigned int		shm_dtime;	/* really target_time_t */
109
	unsigned int		shm_ctime;	/* really target_time_t */
110
	unsigned short		shm_cpid;
111
	unsigned short		shm_lpid;
112
	short			shm_nattch;
113
	unsigned short		shm_npages;
114
	unsigned long		*shm_pages;
115
	void 			*attaches;	/* really struct shm_desc * */
116
};
117

  
118
#define TARGET_IPC_RMID	0
119
#define TARGET_IPC_SET	1
120
#define TARGET_IPC_STAT	2
121

  
122
union target_semun {
123
    int val;
124
    unsigned int buf;	/* really struct semid_ds * */
125
    unsigned int array; /* really unsigned short * */
126
    unsigned int __buf;	/* really struct seminfo * */
127
    unsigned int __pad;	/* really void* */
128
};
129

  
130 54
#define UNAME_MACHINE "ppc"
b/linux-user/syscall.c
1230 1230
    uint32_t	size;
1231 1231
} shm_regions[N_SHM_REGIONS];
1232 1232

  
1233
struct target_ipc_perm
1234
{
1235
    target_long __key;
1236
    target_ulong uid;
1237
    target_ulong gid;
1238
    target_ulong cuid;
1239
    target_ulong cgid;
1240
    unsigned short int mode;
1241
    unsigned short int __pad1;
1242
    unsigned short int __seq;
1243
    unsigned short int __pad2;
1244
    target_ulong __unused1;
1245
    target_ulong __unused2;
1246
};
1247

  
1248
struct target_semid_ds
1249
{
1250
  struct target_ipc_perm sem_perm;
1251
  target_ulong sem_otime;
1252
  target_ulong __unused1;
1253
  target_ulong sem_ctime;
1254
  target_ulong __unused2;
1255
  target_ulong sem_nsems;
1256
  target_ulong __unused3;
1257
  target_ulong __unused4;
1258
};
1259

  
1260
static inline void target_to_host_ipc_perm(struct ipc_perm *host_ip,
1261
                                           target_ulong target_addr)
1262
{
1263
    struct target_ipc_perm *target_ip;
1264
    struct target_semid_ds *target_sd;
1265

  
1266
    lock_user_struct(target_sd, target_addr, 1);
1267
    target_ip=&(target_sd->sem_perm);
1268
    host_ip->__key = tswapl(target_ip->__key);
1269
    host_ip->uid = tswapl(target_ip->uid);
1270
    host_ip->gid = tswapl(target_ip->gid);
1271
    host_ip->cuid = tswapl(target_ip->cuid);
1272
    host_ip->cgid = tswapl(target_ip->cgid);
1273
    host_ip->mode = tswapl(target_ip->mode);
1274
    unlock_user_struct(target_sd, target_addr, 0);
1275
}
1276

  
1277
static inline void host_to_target_ipc_perm(target_ulong target_addr,
1278
                                           struct ipc_perm *host_ip)
1279
{
1280
    struct target_ipc_perm *target_ip;
1281
    struct target_semid_ds *target_sd;
1282

  
1283
    lock_user_struct(target_sd, target_addr, 0);
1284
    target_ip = &(target_sd->sem_perm);
1285
    target_ip->__key = tswapl(host_ip->__key);
1286
    target_ip->uid = tswapl(host_ip->uid);
1287
    target_ip->gid = tswapl(host_ip->gid);
1288
    target_ip->cuid = tswapl(host_ip->cuid);
1289
    target_ip->cgid = tswapl(host_ip->cgid);
1290
    target_ip->mode = tswapl(host_ip->mode);
1291
    unlock_user_struct(target_sd, target_addr, 1);
1292
}
1293

  
1294
static inline void target_to_host_semid_ds(struct semid_ds *host_sd,
1295
                                          target_ulong target_addr)
1296
{
1297
    struct target_semid_ds *target_sd;
1298

  
1299
    lock_user_struct(target_sd, target_addr, 1);
1300
    target_to_host_ipc_perm(&(host_sd->sem_perm),target_addr);
1301
    host_sd->sem_nsems = tswapl(target_sd->sem_nsems);
1302
    host_sd->sem_otime = tswapl(target_sd->sem_otime);
1303
    host_sd->sem_ctime = tswapl(target_sd->sem_ctime);
1304
    unlock_user_struct(target_sd, target_addr, 0);
1305
}
1306

  
1307
static inline void host_to_target_semid_ds(target_ulong target_addr,
1308
                                           struct semid_ds *host_sd)
1309
{
1310
    struct target_semid_ds *target_sd;
1311

  
1312
    lock_user_struct(target_sd, target_addr, 0);
1313
    host_to_target_ipc_perm(target_addr,&(host_sd->sem_perm));
1314
    target_sd->sem_nsems = tswapl(host_sd->sem_nsems);
1315
    target_sd->sem_otime = tswapl(host_sd->sem_otime);
1316
    target_sd->sem_ctime = tswapl(host_sd->sem_ctime);
1317
    unlock_user_struct(target_sd, target_addr, 1);
1318
}
1319

  
1233 1320
union semun {
1234 1321
	int val;
1235
	struct senid_ds *buf;
1322
	struct semid_ds *buf;
1236 1323
	unsigned short *array;
1237 1324
};
1238 1325

  
1326
union target_semun {
1327
	int val;
1328
	target_long buf;
1329
	unsigned short int *array;
1330
};
1331

  
1332
static inline void target_to_host_semun(unsigned long cmd,
1333
                                        union semun *host_su,
1334
                                        target_ulong target_addr,
1335
                                        struct semid_ds *ds)
1336
{
1337
    union target_semun *target_su;
1338

  
1339
    switch( cmd ) {
1340
	case IPC_STAT:
1341
	case IPC_SET:
1342
           lock_user_struct(target_su, target_addr, 1);
1343
	   target_to_host_semid_ds(ds,target_su->buf);
1344
	   host_su->buf = ds;
1345
           unlock_user_struct(target_su, target_addr, 0);
1346
	   break;
1347
	case GETVAL:
1348
	case SETVAL:
1349
           lock_user_struct(target_su, target_addr, 1);
1350
	   host_su->val = tswapl(target_su->val);
1351
           unlock_user_struct(target_su, target_addr, 0);
1352
	   break;
1353
	case GETALL:
1354
	case SETALL:
1355
           lock_user_struct(target_su, target_addr, 1);
1356
	   *host_su->array = tswap16(*target_su->array);
1357
           unlock_user_struct(target_su, target_addr, 0);
1358
	   break;
1359
	default:
1360
           gemu_log("semun operation not fully supported: %d\n", (int)cmd);
1361
    }
1362
}
1363

  
1364
static inline void host_to_target_semun(unsigned long cmd,
1365
                                        target_ulong target_addr,
1366
                                        union semun *host_su,
1367
                                        struct semid_ds *ds)
1368
{
1369
    union target_semun *target_su;
1370

  
1371
    switch( cmd ) {
1372
	case IPC_STAT:
1373
	case IPC_SET:
1374
           lock_user_struct(target_su, target_addr, 0);
1375
	   host_to_target_semid_ds(target_su->buf,ds);
1376
           unlock_user_struct(target_su, target_addr, 1);
1377
	   break;
1378
	case GETVAL:
1379
	case SETVAL:
1380
           lock_user_struct(target_su, target_addr, 0);
1381
	   target_su->val = tswapl(host_su->val);
1382
           unlock_user_struct(target_su, target_addr, 1);
1383
	   break;
1384
	case GETALL:
1385
	case SETALL:
1386
           lock_user_struct(target_su, target_addr, 0);
1387
	   *target_su->array = tswap16(*host_su->array);
1388
           unlock_user_struct(target_su, target_addr, 1);
1389
	   break;
1390
        default:
1391
           gemu_log("semun operation not fully supported: %d\n", (int)cmd);
1392
    }
1393
}
1394

  
1395
static inline long do_semctl(long first, long second, long third, long ptr)
1396
{
1397
    union semun arg;
1398
    struct semid_ds dsarg;
1399
    int cmd = third&0xff;
1400
    long ret = 0;
1401

  
1402
    switch( cmd ) {
1403
	case GETVAL:
1404
            target_to_host_semun(cmd,&arg,ptr,&dsarg);
1405
            ret = get_errno(semctl(first, second, cmd, arg));
1406
            host_to_target_semun(cmd,ptr,&arg,&dsarg);
1407
            break;
1408
	case SETVAL:
1409
            target_to_host_semun(cmd,&arg,ptr,&dsarg);
1410
            ret = get_errno(semctl(first, second, cmd, arg));
1411
            host_to_target_semun(cmd,ptr,&arg,&dsarg);
1412
            break;
1413
	case GETALL:
1414
            target_to_host_semun(cmd,&arg,ptr,&dsarg);
1415
            ret = get_errno(semctl(first, second, cmd, arg));
1416
            host_to_target_semun(cmd,ptr,&arg,&dsarg);
1417
            break;
1418
	case SETALL:
1419
            target_to_host_semun(cmd,&arg,ptr,&dsarg);
1420
            ret = get_errno(semctl(first, second, cmd, arg));
1421
            host_to_target_semun(cmd,ptr,&arg,&dsarg);
1422
            break;
1423
	case IPC_STAT:
1424
            target_to_host_semun(cmd,&arg,ptr,&dsarg);
1425
            ret = get_errno(semctl(first, second, cmd, arg));
1426
            host_to_target_semun(cmd,ptr,&arg,&dsarg);
1427
            break;
1428
	case IPC_SET:
1429
            target_to_host_semun(cmd,&arg,ptr,&dsarg);
1430
            ret = get_errno(semctl(first, second, cmd, arg));
1431
            host_to_target_semun(cmd,ptr,&arg,&dsarg);
1432
            break;
1433
    default:
1434
            ret = get_errno(semctl(first, second, cmd, arg));
1435
    }
1436

  
1437
    return ret;
1438
}
1439

  
1239 1440
/* ??? This only works with linear mappings.  */
1240 1441
static long do_ipc(long call, long first, long second, long third,
1241 1442
		   long ptr, long fifth)
......
1259 1460
        break;
1260 1461

  
1261 1462
    case IPCOP_semctl:
1262
        ret = get_errno(semctl(first, second, third, ((union semun*)ptr)->val));
1263

  
1463
        ret = do_semctl(first, second, third, ptr);
1264 1464
        break;
1265 1465

  
1266 1466
    case IPCOP_semtimedop:

Also available in: Unified diff