|  | /* | 
|  | * 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 |