| /* |
| * Copyright (c) 2014, The Linux Foundation. All rights reserved. |
| * This program is free software; you can redistribute it and/or modify |
| * it under the terms of the GNU General Public License version 2 and |
| * only version 2 as published by the Free Software Foundation. |
| * This program is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| * GNU General Public License for more details. |
| */ |
| #ifndef __QMP_SPHINX_LOGK_STUB__ |
| #define __QMP_SPHINX_LOGK_STUB__ |
| |
| #ifdef CONFIG_QMP_CORE |
| #include <linux/kernel.h> |
| /*(blksize(256) - hdrsize(60))*/ |
| #define MAX_BUF_SIZE 196 |
| |
| extern void *(*qmp_sphinx_logk_kernel_begin) (char **buf); |
| extern void (*qmp_sphinx_logk_kernel_end) (void *blck); |
| |
| static inline void *qmp_sphinx_setup_buf(char **buf) |
| { |
| void *blck; |
| |
| if (qmp_sphinx_logk_kernel_begin && qmp_sphinx_logk_kernel_end) { |
| blck = qmp_sphinx_logk_kernel_begin(buf); |
| if (!*buf) { |
| qmp_sphinx_logk_kernel_end(blck); |
| return NULL; |
| } |
| } else { |
| return NULL; |
| } |
| return blck; |
| } |
| /* |
| * NOTE: only sendto is going to be instrumented |
| * since send sys call internally calls sendto |
| * with 2 extra parameters |
| */ |
| static inline void qmp_sphinx_logk_sendto(int fd, void __user *buff, size_t len, |
| unsigned flags, struct sockaddr __user *addr, int addr_len) |
| { |
| char *buf = NULL; |
| void *blck = NULL; |
| |
| /*sets up buf and blck correctly*/ |
| blck = qmp_sphinx_setup_buf(&buf); |
| if (!blck) |
| return; |
| |
| /*fill the buf*/ |
| snprintf(buf, MAX_BUF_SIZE, "-1|kernel|sendto|len=%u,fd=%d|--end", |
| (unsigned int)len, fd); |
| |
| qmp_sphinx_logk_kernel_end(blck); |
| } |
| |
| /* |
| * NOTE: only recvfrom is going to be instrumented |
| * since recv sys call internally calls recvfrom |
| * with 2 extra parameters |
| */ |
| static inline void qmp_sphinx_logk_recvfrom(int fd, void __user *ubuf, |
| size_t size, unsigned flags, struct sockaddr __user *addr, |
| int __user *addr_len) |
| { |
| char *buf = NULL; |
| void *blck = NULL; |
| |
| /*sets up buf and blck correctly*/ |
| blck = qmp_sphinx_setup_buf(&buf); |
| if (!blck) |
| return; |
| |
| /*fill the buf*/ |
| snprintf(buf, MAX_BUF_SIZE, "-1|kernel|recvfrom|size=%u,fd=%d|--end", |
| (unsigned int)size, fd); |
| |
| qmp_sphinx_logk_kernel_end(blck); |
| } |
| |
| static inline void qmp_sphinx_logk_oom_adjust_write(pid_t pid, |
| uid_t uid, int oom_adj) |
| { |
| char *buf = NULL; |
| void *blck = NULL; |
| |
| /*sets up buf and blck correctly*/ |
| blck = qmp_sphinx_setup_buf(&buf); |
| if (!blck) |
| return; |
| |
| /*fill the buf*/ |
| snprintf(buf, MAX_BUF_SIZE, |
| "-1|kernel|oom_adjust_write|app_uid=%d,app_pid=%d,oom_adj=%d|--end", |
| uid, pid, oom_adj); |
| |
| qmp_sphinx_logk_kernel_end(blck); |
| } |
| |
| static inline void qmp_sphinx_logk_oom_score_adj_write(pid_t pid, uid_t uid, |
| int oom_adj_score) |
| { |
| char *buf = NULL; |
| void *blck = NULL; |
| |
| /*sets up buf and blck correctly*/ |
| blck = qmp_sphinx_setup_buf(&buf); |
| if (!blck) |
| return; |
| |
| /*fill the buf*/ |
| snprintf(buf, MAX_BUF_SIZE, |
| "-1|kernel|oom_score_adj_write|app_uid=%d,app_pid=%d,oom_adj=%d|--end", |
| uid, pid, oom_adj_score); |
| |
| qmp_sphinx_logk_kernel_end(blck); |
| } |
| |
| #else |
| static inline void qmp_sphinx_logk_sendto(int fd, void __user *buff, |
| size_t len, unsigned flags, struct sockaddr __user *addr, |
| int addr_len) |
| { |
| } |
| |
| static inline void qmp_sphinx_logk_recvfrom |
| (int fd, void __user *ubuf, size_t size, |
| unsigned flags, struct sockaddr __user *addr, |
| int __user *addr_len) |
| { |
| } |
| |
| static inline void qmp_sphinx_logk_oom_adjust_write |
| (pid_t pid, uid_t uid, int oom_adj) |
| { |
| } |
| |
| static inline void qmp_sphinx_logk_oom_score_adj_write |
| (pid_t pid, uid_t uid, int oom_adj_score) |
| { |
| } |
| #endif |
| #endif |