44#define HILOG_BUFFER LOSCFG_HILOG_BUFFER_SIZE
45#define DRIVER_MODE 0666
46#define HILOG_DRIVER "/dev/hilog"
51 unsigned int pid : 16;
75#ifndef CONFIG_DISABLE_POLL
129static int HiLogBufferCopy(
unsigned char *dst,
unsigned dstLen,
const unsigned char *src,
size_t srcLen)
132 size_t minLen = (dstLen > srcLen) ? srcLen : dstLen;
144 retval = memcpy_s(dst, dstLen, src, srcLen);
153 if (bufLeft > bufLen) {
182 if (bufLen < header.
len +
sizeof(header)) {
183 PRINTK(
"buffer too small,bufLen=%d, header.len=%d,%d\n", bufLen, header.
len, header.
hdrSize);
190 retval =
HiLogBufferCopy((
unsigned char *)buffer, bufLen, (
unsigned char *)&header,
sizeof(header));
203 retval = header.
len +
sizeof(header);
205 if (retval == -ENOMEM) {
220 if (bufLen > bufLeft) {
242 PRINTK(
"In %s line %d,clock_gettime fail\n", __FUNCTION__, __LINE__);
249 header->
sec = now.tv_sec;
250 header->
nsec = now.tv_nsec;
258 size_t totalSize = bufLen +
sizeof(
struct HiLogEntry);
259 static int dropLogLines = 0;
260 static int isLastTimeFull = 0;
261 int isThisTimeFull = 0;
275 if (isLastTimeFull == 1 && isThisTimeFull == 0) {
277 if (dropLogLines > 0) {
278 PRINTK(
"hilog ringbuffer full, drop %d line(s) log\n", dropLogLines);
292 PRINTK(
"%s\n", buffer);
323 PRINTK(
"write fail retval=%d\n", retval);
331 if (bufLen +
sizeof(
struct HiLogEntry) > HILOG_BUFFER) {
332 PRINTK(
"input too large\n");
343 PRINTK(
"In %s line %d,LOS_MemAlloc fail\n", __FUNCTION__, __LINE__);
358 return register_driver(HILOG_DRIVER, &
g_hilogFops, DRIVER_MODE, NULL);
VOID * LOS_MemAlloc(VOID *pool, UINT32 size)
从指定内存池中申请size长度的内存,注意这可不是从内核堆空间中申请内存
LITE_OS_SEC_TEXT UINT32 LOS_MuxInit(LosMux *mutex, const LosMuxAttr *attr)
初始化互斥锁
LITE_OS_SEC_TEXT UINT32 LOS_CurTaskIDGet(VOID)
Obtain current running task ID.
static void HiLogBufferInc(size_t sz)
读写对冲,对hilog的写操作,更新相关变量内容
static int HiLogBufferCopy(unsigned char *dst, unsigned dstLen, const unsigned char *src, size_t srcLen)
static void HiLogBufferDec(size_t sz)
读写对冲,对hilog的读操作,更新相关变量内容
static unsigned char * HiLogBufferHead(void)
static ssize_t HiLogRead(struct file *filep, char *buffer, size_t bufLen)
int HiLogClose(struct file *filep)
为支持VFS,作关闭状
int OsHiLogDriverInit(VOID)
初始化hilog驱动
ssize_t HilogRead(struct file *filep, char __user *buf, size_t count)
static void HiLogDeviceInit(void)
初始化全局变量g_hiLogDev
static void HiLogCoverOldLog(size_t bufLen)
STATIC struct file_operations_vfs g_hilogFops
static ssize_t HiLogWrite(struct file *filep, const char *buffer, size_t bufLen)
写hilog,外部以VFS方式写入
static int HiLogReadRingBuffer(unsigned char *buffer, size_t bufLen)
读取ring buffer
static int HiLogWriteRingBuffer(unsigned char *buffer, size_t bufLen)
写入 RingBuffer环形缓冲,也叫 circleBuffer
int HiLogWriteInternal(const char *buffer, size_t bufLen)
将外部buf写入hilog设备分两步完成
ssize_t HilogWrite(struct file *filep, const char __user *buf, size_t count)
static void HiLogHeadInit(struct HiLogEntry *header, size_t len)
hilog实体初始化
int HiLogOpen(struct file *filep)
为支持VFS,作打开状
LOS_MODULE_INIT(OsHiLogDriverInit, LOS_INIT_LEVEL_KMOD_EXTENDED)
struct HiLogCharDevice g_hiLogDev
LITE_OS_SEC_TEXT UINT32 LOS_GetCurrProcessID(VOID)
获取当前进程的进程ID
STATIC INLINE LosTaskCB * OsCurrTaskGet(VOID)
STATIC INLINE STATUS_T LOS_MuxAcquire(LosMux *m)
STATIC INLINE STATUS_T LOS_MuxRelease(LosMux *m)
STATIC INLINE BOOL LOS_IsUserAddressRange(VADDR_T vaddr, size_t len)
虚拟地址[vaddr,vaddr + len]是否在用户空间
ARG_NUM_3 ARG_NUM_1 ARG_NUM_2 ARG_NUM_2 ARG_NUM_3 ARG_NUM_1 ARG_NUM_4 ARG_NUM_2 ARG_NUM_2 ARG_NUM_5 ARG_NUM_2 void
int clock_gettime(clockid_t clockID, struct timespec *tp)
当用户程序进行特定系统调用时(例如clock_gettime(CLOCK_REALTIME_COARSE, &ts)),VDSO代码页会将其拦截;
size_t LOS_ArchCopyToUser(void *dst, const void *src, size_t len)
从内核空间拷贝到用户空间
size_t LOS_ArchCopyFromUser(void *dst, const void *src, size_t len)