4344
}
4345
#endif
4346
4347
+#if defined(TARGET_NR_fsconfig) && defined(NR_fsconfig)
4348
+static void
4349
+print_fsconfig_cmd_name(int cmd)
4350
+{
4351
+ switch (cmd) {
4352
+ case FSCONFIG_SET_FLAG:
4353
+ qemu_log("%s%s", "FSCONFIG_SET_FLAG", get_comma(0));
4354
+ break;
4355
+ case FSCONFIG_SET_STRING:
4356
+ qemu_log("%s%s", "FSCONFIG_SET_STRING", get_comma(0));
4357
+ break;
4358
+ case FSCONFIG_SET_BINARY:
4359
+ qemu_log("%s%s", "FSCONFIG_SET_BINARY", get_comma(0));
4360
+ break;
4361
+ case FSCONFIG_SET_PATH:
4362
+ qemu_log("%s%s", "FSCONFIG_SET_PATH", get_comma(0));
4363
+ break;
4364
+ case FSCONFIG_SET_PATH_EMPTY:
4365
+ qemu_log("%s%s", "FSCONFIG_SET_PATH_EMPTY", get_comma(0));
4366
+ break;
4367
+ case FSCONFIG_SET_FD:
4368
+ qemu_log("%s%s", "FSCONFIG_SET_FD", get_comma(0));
4369
+ break;
4370
+ case FSCONFIG_CMD_CREATE:
4371
+ qemu_log("%s%s", "FSCONFIG_CMD_CREATE", get_comma(0));
4372
+ break;
4373
+ case FSCONFIG_CMD_RECONFIGURE:
4374
+ qemu_log("%s%s", "FSCONFIG_CMD_RECONFIGURE", get_comma(0));
4375
+ break;
4376
+#ifdef FSCONFIG_CMD_CREATE_EXCL
4377
+ case FSCONFIG_CMD_CREATE_EXCL:
4378
+ /* Only available since Linux 6.6. */
4379
+ qemu_log("%s%s", "FSCONFIG_CMD_CREATE_EXCL", get_comma(0));
4380
+ break;
4381
+#endif
4382
+ default:
4383
+ qemu_log("%s (%d)%s", "UNKNOWN_CMD", cmd, get_comma(0));
4384
+ break;
4385
+ }
4386
+}
4387
+
4388
+static void
4389
+print_fsconfig(CPUArchState *cpu_env, const struct syscallname *name,
4390
+ abi_long arg0, abi_long arg1, abi_long arg2,
4391
+ abi_long arg3, abi_long arg4, abi_long arg5)
4392
+{
4393
+ /*
4394
+ * fsconfig(int fd, int cmd, char* key, void* value, int aux)
4395
+ * Where:
4396
+ * fd: file descriptor returned by fsopen().
4397
+ * cmd: integer constant specifying a command.
4398
+ * key: a string, can be NULL on certain commands.
4399
+ * value: any data in a buffer, can be NULL, raw buffer or a string.
4400
+ * aux: axillary values such as flags for FSCONFIG_SET_PATH.
4401
+ */
4402
+ int cmd = (int) arg1;
4403
+ print_syscall_prologue(name);
4404
+ print_raw_param("%d", arg0, 0);
4405
+ print_fsconfig_cmd_name(cmd);
4406
+ /* Process arg2 (key). */
4407
+ switch (cmd) {
4408
+ case FSCONFIG_SET_FLAG:
4409
+ case FSCONFIG_SET_STRING:
4410
+ case FSCONFIG_SET_BINARY:
4411
+ case FSCONFIG_SET_PATH:
4412
+ case FSCONFIG_SET_PATH_EMPTY:
4413
+ case FSCONFIG_SET_FD:
4414
+ print_string(arg2, 0);
4415
+ break;
4416
+ default:
4417
+ print_pointer(arg2, 0);
4418
+ break;
4419
+ }
4420
+ /* Process arg3 (value). */
4421
+ switch (cmd) {
4422
+ case FSCONFIG_SET_STRING:
4423
+ case FSCONFIG_SET_PATH:
4424
+ case FSCONFIG_SET_PATH_EMPTY:
4425
+ print_string(arg3, 0);
4426
+ break;
4427
+ default:
4428
+ print_pointer(arg3, 0);
4429
+ break;
4430
+ }
4431
+ /*
4432
+ * Process arg4 (aux).
4433
+ * On FSCONFIG_SET_PATH and FSCONFIG_SET_PATH_EMPTY, aux can
4434
+ * be either 0 or AT_FDCWD.
4435
+ * On FSCONFIG_SET_BINARY, aux is an integer to state the length
4436
+ * of the buffer pointed by arg3.
4437
+ * Otherwise, it must be 0.
4438
+ */
4439
+ switch (cmd) {
4440
+ case FSCONFIG_SET_PATH:
4441
+ case FSCONFIG_SET_PATH_EMPTY:
4442
+ print_at_dirfd(arg4, 1);
4443
+ break;
4444
+ default:
4445
+ print_raw_param("%d", arg4, 1);
4446
+ break;
4447
+ }
4448
+ print_syscall_epilogue(name);
4449
+}
4450
+#endif
4451
+
4452
#ifdef TARGET_NR_ioctl
4453
static void
4454
print_ioctl(CPUArchState *cpu_env, const struct syscallname *name,