/** * Header file of MobiCore Driver Kernel Module. * * @addtogroup MobiCore_Driver_Kernel_Module * @{ * Internal structures of the McDrvModule * @file * * Header file the MobiCore Driver Kernel Module, * its internal structures and defines. * * * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. */ #ifndef _MC_DRV_KMOD_H_ #define _MC_DRV_KMOD_H_ #include "mcDrvModuleLinuxApi.h" #include "public/mcDrvModuleApi.h" /** Platform specific settings */ #include "platform.h" /** ARM Specific masks and modes */ #define ARM_CPSR_MASK 0x1F #define ARM_MONITOR_MODE 0b10110 #define ARM_SECURITY_EXTENSION_MASK 0x30 /** Number of page table entries in one L2 table. This is ARM specific, an * L2 table covers 1 MiB by using 256 entry referring to 4KiB pages each. */ #define MC_ARM_L2_TABLE_ENTRIES 256 /** Number of address allocations for one driver instance. */ #define MC_DRV_KMOD_TUPLE_NR 16 /** Number of pages for L2 tables. There are 4 table in each page. */ #define MC_DRV_KMOD_L2_TABLE_PER_PAGES 4 #define MC_DRV_KMOD_L2_TABLE_PAGES 8 struct l2Table { pte_t tableEntries[MC_ARM_L2_TABLE_ENTRIES]; }; #define INVALID_ADDRESS ((void *)(-1)) /** ARM L2 PTE bits */ #define L2_FLAG_SMALL_XN (1U << 0) #define L2_FLAG_SMALL (1U << 1) #define L2_FLAG_B (1U << 2) #define L2_FLAG_C (1U << 3) #define L2_FLAG_AP0 (1U << 4) #define L2_FLAG_AP1 (1U << 5) #define L2_FLAG_SMALL_TEX0 (1U << 6) #define L2_FLAG_SMALL_TEX1 (1U << 7) #define L2_FLAG_SMALL_TEX2 (1U << 8) #define L2_FLAG_APX (1U << 9) #define L2_FLAG_S (1U << 10) #define L2_FLAG_NG (1U << 11) /** * tuple list entry. * It describes the tuple, physical Kernel start address to the virtual Client * address. The virtual kernel address is added for a simpler search algorithm. */ struct mc_tuple { unsigned int handle; /* unique handle */ void *virtUserAddr; /**< virtual User start address */ void *virtKernelAddr; /**< virtual Kernel start address */ void *physAddr; /**< physical start address */ unsigned int numPages; /**< number of pages */ }; /** * Driver instance data. */ struct mcInstance { /** unique handle */ unsigned int handle; /** process that opened this instance */ pid_t pidVnr; struct { /** number of pages */ unsigned int numPages; /** virtual start address kernel address space generated by mmap command */ void *virtAddr; /** physical start address kernel address space generated by mmap command */ void *physAddr; } map; /** tuple list for mmap generated address space and its virtual client address */ struct mc_tuple tuple[MC_DRV_KMOD_TUPLE_NR]; }; /** data structure of 4 L2 tables within one 4kb page*/ struct mcL2Page { struct l2Table table[MC_DRV_KMOD_L2_TABLE_PER_PAGES]; }; /** bookkeeping data structure that manages 4 L2 tables in one page */ struct mcL2TablesChunk { struct list_head list; unsigned int usageBitmap; /**< usage bitmap */ struct mcL2Page *kernelVirt; /**< kernel virtual address */ struct mcL2Page *phys; /**< physical address */ struct page *pPage; /**< pointer to page struct */ }; /** bookkeeping data structure that binds one L2 table to its chunk(page) and its user */ struct mcL2TablesDescr { struct list_head list; unsigned int handle; unsigned int flags; struct mcInstance *pInstance; struct mcL2TablesChunk *pChunk; unsigned int idx; unsigned int nrOfPages; }; #define MC_WSM_L2_CONTAINER_WSM_LOCKED_BY_APP (1U << 0) #define MC_WSM_L2_CONTAINER_WSM_LOCKED_BY_MC (1U << 1) /** MobiCore S-SIQ interrupt context data. */ struct mcSSiqCtx { atomic_t counter; /**< S-SIQ interrupt counter */ }; /** MobiCore Daemon context data. */ struct mcDaemonCtx { struct semaphore sem; /**< event semaphore */ struct fasync_struct *pAsyncQueue; unsigned int ssiqCounter; /**< event counter */ }; /** MobiCore Driver Kernel Module context data. */ struct mcDrvKModCtx { atomic_t uniqueCounter; /**< ever incrementing counter */ struct mcSSiqCtx ssiqCtx; /**< S-SIQ interrupt context */ struct mcDaemonCtx daemonCtx; /**< MobiCore Daemon context */ struct mcInstance *daemonInst; /**< pointer to instance of daemon */ struct list_head wsmL2Chunks; /**< Backing store for L2 tables */ struct list_head wsmL2Descriptors; /**< Bookkeeping for L2 tables */ struct semaphore wsmL2Sem; /**< semaphore to synchronize access to above lists */ }; /** MobiCore internal trace buffer structure. */ struct mcTraceBuf { uint32_t version; /**< version of trace buffer */ uint32_t length; /**< length of allocated buffer(includes header) */ uint32_t write_pos; /**< last write position */ char buff[1]; /**< start of the log buffer */ }; #define MCDRV_DBG_ERROR(txt, ...) \ printk(KERN_ERR "mcDrvKMod [%d] %s() ### ERROR: " txt, \ task_pid_vnr(current), \ __func__, \ ##__VA_ARGS__) /* dummy function helper macro. */ #define DUMMY_FUNCTION() do {} while (0) #if defined(DEBUG) /* #define DEBUG_VERBOSE */ #if defined(DEBUG_VERBOSE) #define MCDRV_DBG_VERBOSE MCDRV_DBG #else #define MCDRV_DBG_VERBOSE(...) DUMMY_FUNCTION() #endif #define MCDRV_DBG(txt, ...) \ printk(KERN_INFO "mcDrvKMod [%d on CPU%d] %s(): " txt, \ task_pid_vnr(current), \ raw_smp_processor_id(), \ __func__, \ ##__VA_ARGS__) #define MCDRV_DBG_WARN(txt, ...) \ printk(KERN_WARNING "mcDrvKMod [%d] %s() WARNING: " txt, \ task_pid_vnr(current), \ __func__, \ ##__VA_ARGS__) #define MCDRV_ASSERT(cond) \ do { \ if (unlikely(!(cond))) { \ panic("mcDrvKMod Assertion failed: %s:%d\n", \ __FILE__, __LINE__); \ } \ } while (0) #else #define MCDRV_DBG_VERBOSE(...) DUMMY_FUNCTION() #define MCDRV_DBG(...) DUMMY_FUNCTION() #define MCDRV_DBG_WARN(...) DUMMY_FUNCTION() #define MCDRV_ASSERT(...) DUMMY_FUNCTION() #endif /* [not] defined(DEBUG) */ #endif /* _MC_DRV_KMOD_H_ */ /** @} */