|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [mini-os master] use alloc_file_type() and get_file_from_fd() in tpm_tis
commit 75cbe52859b53fcb81fb0859ca51aec76605756e
Author: Juergen Gross <jgross@xxxxxxxx>
AuthorDate: Sun Jan 16 09:33:20 2022 +0100
Commit: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
CommitDate: Tue Jan 18 18:26:43 2022 +0000
use alloc_file_type() and get_file_from_fd() in tpm_tis
Allocate a file type dynamically via alloc_file_type().
Instead of directly accessing the files[] array use get_file_from_fd().
Make some now local functions static and modify their prototypes to
match the file_ops requirements.
Signed-off-by: Juergen Gross <jgross@xxxxxxxx>
Reviewed-by: Samuel Thibault <samuel.thibault@xxxxxxxxxxxx>
---
include/lib.h | 3 +-
include/tpm_tis.h | 6 ---
lib/sys.c | 23 -----------
tpm_tis.c | 121 ++++++++++++++++++++++++++++++++++--------------------
4 files changed, 78 insertions(+), 75 deletions(-)
diff --git a/include/lib.h b/include/lib.h
index c5e4778..9dfb468 100644
--- a/include/lib.h
+++ b/include/lib.h
@@ -168,8 +168,7 @@ extern struct wait_queue_head event_queue;
#define FTYPE_TAP 8
#define FTYPE_BLK 9
#define FTYPE_TPMFRONT 10
-#define FTYPE_TPM_TIS 11
-#define FTYPE_N 12
+#define FTYPE_N 11
#define FTYPE_SPARE 16
struct file {
diff --git a/include/tpm_tis.h b/include/tpm_tis.h
index 86e83f1..2af974d 100644
--- a/include/tpm_tis.h
+++ b/include/tpm_tis.h
@@ -37,14 +37,11 @@ struct tpm_chip;
struct tpm_chip* init_tpm_tis(unsigned long baseaddr, int localities, unsigned
int irq);
struct tpm_chip* init_tpm2_tis(unsigned long baseaddr, int localities,
unsigned int irq);
-void shutdown_tpm_tis(struct tpm_chip* tpm);
int tpm_tis_request_locality(struct tpm_chip* tpm, int locality);
int tpm_tis_cmd(struct tpm_chip* tpm, uint8_t* req, size_t reqlen, uint8_t**
resp, size_t* resplen);
#ifdef HAVE_LIBC
-#include <sys/stat.h>
-#include <fcntl.h>
/* POSIX IO functions:
* use tpm_tis_open() to get a file descriptor to the tpm device
* use write() on the fd to send a command to the backend. You must
@@ -53,9 +50,6 @@ int tpm_tis_cmd(struct tpm_chip* tpm, uint8_t* req, size_t
reqlen, uint8_t** res
* fstat() to get the size of the response and lseek() to seek on it.
*/
int tpm_tis_open(struct tpm_chip* tpm);
-int tpm_tis_posix_read(int fd, uint8_t* buf, size_t count);
-int tpm_tis_posix_write(int fd, const uint8_t* buf, size_t count);
-int tpm_tis_posix_fstat(int fd, struct stat* buf);
#endif
#endif
diff --git a/lib/sys.c b/lib/sys.c
index 217073d..f472fdf 100644
--- a/lib/sys.c
+++ b/lib/sys.c
@@ -29,7 +29,6 @@
#include <blkfront.h>
#include <fbfront.h>
#include <tpmfront.h>
-#include <tpm_tis.h>
#include <xenbus.h>
#include <xenstore.h>
#include <poll.h>
@@ -355,11 +354,6 @@ int read(int fd, void *buf, size_t nbytes)
case FTYPE_TPMFRONT: {
return tpmfront_posix_read(fd, buf, nbytes);
}
-#endif
-#ifdef CONFIG_TPM_TIS
- case FTYPE_TPM_TIS: {
- return tpm_tis_posix_read(fd, buf, nbytes);
- }
#endif
default:
break;
@@ -412,10 +406,6 @@ int write(int fd, const void *buf, size_t nbytes)
#ifdef CONFIG_TPMFRONT
case FTYPE_TPMFRONT:
return tpmfront_posix_write(fd, buf, nbytes);
-#endif
-#ifdef CONFIG_TPM_TIS
- case FTYPE_TPM_TIS:
- return tpm_tis_posix_write(fd, buf, nbytes);
#endif
default:
break;
@@ -482,10 +472,6 @@ off_t lseek(int fd, off_t offset, int whence)
#ifdef CONFIG_TPMFRONT
case FTYPE_TPMFRONT:
break;
-#endif
-#ifdef CONFIG_TPM_TIS
- case FTYPE_TPM_TIS:
- break;
#endif
case FTYPE_FILE:
break;
@@ -543,11 +529,6 @@ int close(int fd)
shutdown_tpmfront(files[fd].dev);
break;
#endif
-#ifdef CONFIG_TPM_TIS
- case FTYPE_TPM_TIS:
- shutdown_tpm_tis(files[fd].dev);
- break;
-#endif
#ifdef CONFIG_KBDFRONT
case FTYPE_KBD:
shutdown_kbdfront(files[fd].dev);
@@ -636,10 +617,6 @@ int fstat(int fd, struct stat *buf)
#ifdef CONFIG_TPMFRONT
case FTYPE_TPMFRONT:
return tpmfront_posix_fstat(fd, buf);
-#endif
-#ifdef CONFIG_TPM_TIS
- case FTYPE_TPM_TIS:
- return tpm_tis_posix_fstat(fd, buf);
#endif
default:
break;
diff --git a/tpm_tis.c b/tpm_tis.c
index 477f555..c3998f2 100644
--- a/tpm_tis.c
+++ b/tpm_tis.c
@@ -792,6 +792,9 @@ int tpm_tis_send(struct tpm_chip* tpm, uint8_t* buf, size_t
len) {
int status, burstcnt = 0;
int count = 0;
uint32_t ordinal;
+#ifdef HAVE_LIBC
+ struct file *file = get_file_from_fd(tpm->fd);
+#endif
if(tpm_tis_request_locality(tpm, tpm->locality) < 0) {
return -EBUSY;
@@ -844,9 +847,10 @@ int tpm_tis_send(struct tpm_chip* tpm, uint8_t* buf,
size_t len) {
}
}
#ifdef HAVE_LIBC
- if(tpm->fd >= 0) {
- files[tpm->fd].read = false;
- files[tpm->fd].offset = 0;
+ if ( file )
+ {
+ file->read = false;
+ file->offset = 0;
}
#endif
return len;
@@ -1093,6 +1097,25 @@ ssize_t tpm_getcap(struct tpm_chip *chip, uint32_t
subcap_id, cap_t *cap,
return rc;
}
+static void shutdown_tpm_tis(struct tpm_chip *tpm)
+{
+ int i;
+
+ printk("Shutting down tpm_tis device\n");
+
+ iowrite32(TPM_INT_ENABLE(tpm, tpm->locality), ~TPM_GLOBAL_INT_ENABLE);
+
+ /* Unmap all of the mmio pages */
+ for ( i = 0; i < 5; ++i )
+ {
+ if ( tpm->pages[i] != NULL )
+ {
+ iounmap(tpm->pages[i], PAGE_SIZE);
+ tpm->pages[i] = NULL;
+ }
+ }
+ free(tpm);
+}
struct tpm_chip* init_tpm_tis(unsigned long baseaddr, int localities, unsigned
int irq)
{
@@ -1242,25 +1265,6 @@ abort_egress:
return NULL;
}
-void shutdown_tpm_tis(struct tpm_chip* tpm){
- int i;
-
- printk("Shutting down tpm_tis device\n");
-
- iowrite32(TPM_INT_ENABLE(tpm, tpm->locality), ~TPM_GLOBAL_INT_ENABLE);
-
- /*Unmap all of the mmio pages */
- for(i = 0; i < 5; ++i) {
- if(tpm->pages[i] != NULL) {
- iounmap(tpm->pages[i], PAGE_SIZE);
- tpm->pages[i] = NULL;
- }
- }
- free(tpm);
- return;
-}
-
-
int tpm_tis_cmd(struct tpm_chip* tpm, uint8_t* req, size_t reqlen, uint8_t**
resp, size_t* resplen)
{
if(tpm->locality < 0) {
@@ -1279,23 +1283,19 @@ int tpm_tis_cmd(struct tpm_chip* tpm, uint8_t* req,
size_t reqlen, uint8_t** res
}
#ifdef HAVE_LIBC
-int tpm_tis_open(struct tpm_chip* tpm)
+#include <sys/stat.h>
+#include <fcntl.h>
+
+static int tpm_tis_close(struct file *file)
{
- /* Silently prevent multiple opens */
- if(tpm->fd != -1) {
- return tpm->fd;
- }
+ shutdown_tpm_tis(file->dev);
- tpm->fd = alloc_fd(FTYPE_TPM_TIS);
- printk("tpm_tis_open() -> %d\n", tpm->fd);
- files[tpm->fd].dev = tpm;
- return tpm->fd;
+ return 0;
}
-int tpm_tis_posix_write(int fd, const uint8_t* buf, size_t count)
+static int tpm_tis_posix_write(struct file *file, const void *buf, size_t
count)
{
- struct tpm_chip* tpm;
- tpm = files[fd].dev;
+ struct tpm_chip *tpm = file->dev;
if(tpm->locality < 0) {
printk("tpm_tis_posix_write() failed! locality not set!\n");
@@ -1319,11 +1319,10 @@ int tpm_tis_posix_write(int fd, const uint8_t* buf,
size_t count)
return count;
}
-int tpm_tis_posix_read(int fd, uint8_t* buf, size_t count)
+static int tpm_tis_posix_read(struct file *file, void *buf, size_t count)
{
int rc;
- struct tpm_chip* tpm;
- tpm = files[fd].dev;
+ struct tpm_chip *tpm = file->dev;
if(count == 0) {
return 0;
@@ -1337,20 +1336,21 @@ int tpm_tis_posix_read(int fd, uint8_t* buf, size_t
count)
/* Handle EOF case */
- if(files[fd].offset >= tpm->data_len) {
+ if ( file->offset >= tpm->data_len )
+ {
rc = 0;
} else {
- rc = min(tpm->data_len - files[fd].offset, count);
- memcpy(buf, tpm->data_buffer + files[fd].offset, rc);
+ rc = min(tpm->data_len - file->offset, count);
+ memcpy(buf, tpm->data_buffer + file->offset, rc);
}
- files[fd].offset += rc;
+ file->offset += rc;
/* Reset the data pending flag */
return rc;
}
-int tpm_tis_posix_fstat(int fd, struct stat* buf)
+
+static int tpm_tis_posix_fstat(struct file *file, struct stat *buf)
{
- struct tpm_chip* tpm;
- tpm = files[fd].dev;
+ struct tpm_chip *tpm = file->dev;
buf->st_mode = O_RDWR;
buf->st_uid = 0;
@@ -1360,6 +1360,39 @@ int tpm_tis_posix_fstat(int fd, struct stat* buf)
return 0;
}
+static const struct file_ops tpm_tis_ops = {
+ .name = "tpm_tis",
+ .read = tpm_tis_posix_read,
+ .write = tpm_tis_posix_write,
+ .lseek = lseek_default,
+ .close = tpm_tis_close,
+ .fstat = tpm_tis_posix_fstat,
+};
+
+static unsigned int ftype_tis;
+
+__attribute__((constructor))
+static void tpm_tis_initialize(void)
+{
+ ftype_tis = alloc_file_type(&tpm_tis_ops);
+}
+
+int tpm_tis_open(struct tpm_chip *tpm)
+{
+ struct file *file;
+
+ /* Silently prevent multiple opens */
+ if ( tpm->fd != -1 )
+ return tpm->fd;
+
+ tpm->fd = alloc_fd(ftype_tis);
+ printk("tpm_tis_open() -> %d\n", tpm->fd);
+ file = get_file_from_fd(tpm->fd);
+ file->dev = tpm;
+
+ return tpm->fd;
+}
+
/* TPM 2.0 */
/*TPM2.0 Selftest*/
--
generated by git-patchbot for /home/xen/git/mini-os.git#master
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |