static int mmio_read_x(int argc, const char *argv[], const struct cmd_info *info) { int ret; data_store data; struct mmap_info mmap_addr; const struct mmap_file_flags *mmf; mmf = info->privdata; mmap_addr.addr = strtoull(argv[1], NULL, 0); if (open_mapping(&mmap_addr, O_RDONLY | mmf->flags, sizeof(data)) < 0) { return -1; } ret = 0; #define DO_READ(mem_, off_, size_)\ data.u ##size_ = *(typeof(data.u ##size_) *)(mem_ + off_); \ fprintf(stdout, "0x%0*llx\n", (int)sizeof(data.u ##size_)*2, \ (unsigned long long)data.u ##size_) switch (get_command_size(info)) { case SIZE8: DO_READ(mmap_addr.mem, mmap_addr.off, 8); break; case SIZE16: DO_READ(mmap_addr.mem, mmap_addr.off, 16); break; case SIZE32: DO_READ(mmap_addr.mem, mmap_addr.off, 32); break; case SIZE64: if (sizeof(void *) != sizeof(uint64_t)) { fprintf(stderr, "warning: 64 bit operations might " "not be atomic on 32 bit builds\n"); } DO_READ(mmap_addr.mem, mmap_addr.off, 64); break; default: fprintf(stderr, "invalid mmio_read parameter\n"); ret = -1; } close_mapping(&mmap_addr); return ret; }
static int mmio_write_x(int argc, const char *argv[], const struct cmd_info *info) { int ret; unsigned long ldata; data_store data; struct mmap_info mmap_addr; mmap_addr.addr = strtoull(argv[1], NULL, 0); ldata = strtoul(argv[2], NULL, 0); if (open_mapping(&mmap_addr, O_RDWR, sizeof(data)) < 0) { return -1; } ret = 0; #define DO_WRITE(mem_, off_, size_)\ data.u ##size_ = (typeof(data.u ##size_))ldata;\ *(typeof(data.u ##size_) *)(mem_+off_) = data.u ##size_ switch (get_command_size(info)) { case SIZE8: DO_WRITE(mmap_addr.mem, mmap_addr.off, 8); break; case SIZE16: DO_WRITE(mmap_addr.mem, mmap_addr.off, 16); break; case SIZE32: DO_WRITE(mmap_addr.mem, mmap_addr.off, 32); break; case SIZE64: if (sizeof(void *) != sizeof(uint64_t)) { fprintf(stderr, "warning: 64 bit operations might " "not be atomic on 32 bit builds\n"); } DO_WRITE(mmap_addr.mem, mmap_addr.off, 64); break; default: fprintf(stderr, "invalid mmio_write parameter\n"); ret = -1; } close_mapping(&mmap_addr); return ret; }
guint32 tpm2_command_get_size (Tpm2Command *command) { return get_command_size (command->buffer); }