Commit 9bbf28a3 authored by Atsushi Nemoto's avatar Atsushi Nemoto Committed by Ralf Baechle

[MIPS] Sparse: Add some __user tags to signal functions.

Signed-off-by: default avatarAtsushi Nemoto <anemo@mba.ocn.ne.jp>
Signed-off-by: default avatarRalf Baechle <ralf@linux-mips.org>
parent 5be0f654
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
#include <linux/config.h> #include <linux/config.h>
static inline int static inline int
setup_sigcontext(struct pt_regs *regs, struct sigcontext *sc) setup_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc)
{ {
int err = 0; int err = 0;
...@@ -82,7 +82,7 @@ setup_sigcontext(struct pt_regs *regs, struct sigcontext *sc) ...@@ -82,7 +82,7 @@ setup_sigcontext(struct pt_regs *regs, struct sigcontext *sc)
} }
static inline int static inline int
restore_sigcontext(struct pt_regs *regs, struct sigcontext *sc) restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc)
{ {
unsigned int used_math; unsigned int used_math;
unsigned long treg; unsigned long treg;
...@@ -157,7 +157,7 @@ restore_sigcontext(struct pt_regs *regs, struct sigcontext *sc) ...@@ -157,7 +157,7 @@ restore_sigcontext(struct pt_regs *regs, struct sigcontext *sc)
/* /*
* Determine which stack to use.. * Determine which stack to use..
*/ */
static inline void * static inline void __user *
get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, size_t frame_size) get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, size_t frame_size)
{ {
unsigned long sp; unsigned long sp;
...@@ -176,7 +176,7 @@ get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, size_t frame_size) ...@@ -176,7 +176,7 @@ get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, size_t frame_size)
if ((ka->sa.sa_flags & SA_ONSTACK) && (sas_ss_flags (sp) == 0)) if ((ka->sa.sa_flags & SA_ONSTACK) && (sas_ss_flags (sp) == 0))
sp = current->sas_ss_sp + current->sas_ss_size; sp = current->sas_ss_sp + current->sas_ss_size;
return (void *)((sp - frame_size) & (ICACHE_REFILLS_WORKAROUND_WAR ? 32 : ALMASK)); return (void __user *)((sp - frame_size) & (ICACHE_REFILLS_WORKAROUND_WAR ? 32 : ALMASK));
} }
static inline int install_sigtramp(unsigned int __user *tramp, static inline int install_sigtramp(unsigned int __user *tramp,
......
...@@ -199,10 +199,10 @@ save_static_function(sys_sigreturn); ...@@ -199,10 +199,10 @@ save_static_function(sys_sigreturn);
__attribute_used__ noinline static void __attribute_used__ noinline static void
_sys_sigreturn(nabi_no_regargs struct pt_regs regs) _sys_sigreturn(nabi_no_regargs struct pt_regs regs)
{ {
struct sigframe *frame; struct sigframe __user *frame;
sigset_t blocked; sigset_t blocked;
frame = (struct sigframe *) regs.regs[29]; frame = (struct sigframe __user *) regs.regs[29];
if (!access_ok(VERIFY_READ, frame, sizeof(*frame))) if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
goto badframe; goto badframe;
if (__copy_from_user(&blocked, &frame->sf_mask, sizeof(blocked))) if (__copy_from_user(&blocked, &frame->sf_mask, sizeof(blocked)))
...@@ -236,11 +236,11 @@ save_static_function(sys_rt_sigreturn); ...@@ -236,11 +236,11 @@ save_static_function(sys_rt_sigreturn);
__attribute_used__ noinline static void __attribute_used__ noinline static void
_sys_rt_sigreturn(nabi_no_regargs struct pt_regs regs) _sys_rt_sigreturn(nabi_no_regargs struct pt_regs regs)
{ {
struct rt_sigframe *frame; struct rt_sigframe __user *frame;
sigset_t set; sigset_t set;
stack_t st; stack_t st;
frame = (struct rt_sigframe *) regs.regs[29]; frame = (struct rt_sigframe __user *) regs.regs[29];
if (!access_ok(VERIFY_READ, frame, sizeof(*frame))) if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
goto badframe; goto badframe;
if (__copy_from_user(&set, &frame->rs_uc.uc_sigmask, sizeof(set))) if (__copy_from_user(&set, &frame->rs_uc.uc_sigmask, sizeof(set)))
...@@ -259,7 +259,7 @@ _sys_rt_sigreturn(nabi_no_regargs struct pt_regs regs) ...@@ -259,7 +259,7 @@ _sys_rt_sigreturn(nabi_no_regargs struct pt_regs regs)
goto badframe; goto badframe;
/* It is more difficult to avoid calling this function than to /* It is more difficult to avoid calling this function than to
call it and ignore errors. */ call it and ignore errors. */
do_sigaltstack(&st, NULL, regs.regs[29]); do_sigaltstack((stack_t __user *)&st, NULL, regs.regs[29]);
/* /*
* Don't let your children do this ... * Don't let your children do this ...
...@@ -279,7 +279,7 @@ _sys_rt_sigreturn(nabi_no_regargs struct pt_regs regs) ...@@ -279,7 +279,7 @@ _sys_rt_sigreturn(nabi_no_regargs struct pt_regs regs)
int setup_frame(struct k_sigaction * ka, struct pt_regs *regs, int setup_frame(struct k_sigaction * ka, struct pt_regs *regs,
int signr, sigset_t *set) int signr, sigset_t *set)
{ {
struct sigframe *frame; struct sigframe __user *frame;
int err = 0; int err = 0;
frame = get_sigframe(ka, regs, sizeof(*frame)); frame = get_sigframe(ka, regs, sizeof(*frame));
...@@ -326,7 +326,7 @@ int setup_frame(struct k_sigaction * ka, struct pt_regs *regs, ...@@ -326,7 +326,7 @@ int setup_frame(struct k_sigaction * ka, struct pt_regs *regs,
int setup_rt_frame(struct k_sigaction * ka, struct pt_regs *regs, int setup_rt_frame(struct k_sigaction * ka, struct pt_regs *regs,
int signr, sigset_t *set, siginfo_t *info) int signr, sigset_t *set, siginfo_t *info)
{ {
struct rt_sigframe *frame; struct rt_sigframe __user *frame;
int err = 0; int err = 0;
frame = get_sigframe(ka, regs, sizeof(*frame)); frame = get_sigframe(ka, regs, sizeof(*frame));
......
...@@ -144,7 +144,7 @@ struct ucontext32 { ...@@ -144,7 +144,7 @@ struct ucontext32 {
extern void __put_sigset_unknown_nsig(void); extern void __put_sigset_unknown_nsig(void);
extern void __get_sigset_unknown_nsig(void); extern void __get_sigset_unknown_nsig(void);
static inline int put_sigset(const sigset_t *kbuf, compat_sigset_t *ubuf) static inline int put_sigset(const sigset_t *kbuf, compat_sigset_t __user *ubuf)
{ {
int err = 0; int err = 0;
...@@ -269,7 +269,7 @@ asmlinkage int sys32_sigaction(int sig, const struct sigaction32 *act, ...@@ -269,7 +269,7 @@ asmlinkage int sys32_sigaction(int sig, const struct sigaction32 *act,
if (!access_ok(VERIFY_READ, act, sizeof(*act))) if (!access_ok(VERIFY_READ, act, sizeof(*act)))
return -EFAULT; return -EFAULT;
err |= __get_user(handler, &act->sa_handler); err |= __get_user(handler, &act->sa_handler);
new_ka.sa.sa_handler = (void*)(s64)handler; new_ka.sa.sa_handler = (void __user *)(s64)handler;
err |= __get_user(new_ka.sa.sa_flags, &act->sa_flags); err |= __get_user(new_ka.sa.sa_flags, &act->sa_flags);
err |= __get_user(mask, &act->sa_mask.sig[0]); err |= __get_user(mask, &act->sa_mask.sig[0]);
if (err) if (err)
...@@ -299,8 +299,8 @@ asmlinkage int sys32_sigaction(int sig, const struct sigaction32 *act, ...@@ -299,8 +299,8 @@ asmlinkage int sys32_sigaction(int sig, const struct sigaction32 *act,
asmlinkage int sys32_sigaltstack(nabi_no_regargs struct pt_regs regs) asmlinkage int sys32_sigaltstack(nabi_no_regargs struct pt_regs regs)
{ {
const stack32_t *uss = (const stack32_t *) regs.regs[4]; const stack32_t __user *uss = (const stack32_t __user *) regs.regs[4];
stack32_t *uoss = (stack32_t *) regs.regs[5]; stack32_t __user *uoss = (stack32_t __user *) regs.regs[5];
unsigned long usp = regs.regs[29]; unsigned long usp = regs.regs[29];
stack_t kss, koss; stack_t kss, koss;
int ret, err = 0; int ret, err = 0;
...@@ -319,7 +319,8 @@ asmlinkage int sys32_sigaltstack(nabi_no_regargs struct pt_regs regs) ...@@ -319,7 +319,8 @@ asmlinkage int sys32_sigaltstack(nabi_no_regargs struct pt_regs regs)
} }
set_fs (KERNEL_DS); set_fs (KERNEL_DS);
ret = do_sigaltstack(uss ? &kss : NULL , uoss ? &koss : NULL, usp); ret = do_sigaltstack(uss ? (stack_t __user *)&kss : NULL,
uoss ? (stack_t __user *)&koss : NULL, usp);
set_fs (old_fs); set_fs (old_fs);
if (!ret && uoss) { if (!ret && uoss) {
...@@ -335,7 +336,7 @@ asmlinkage int sys32_sigaltstack(nabi_no_regargs struct pt_regs regs) ...@@ -335,7 +336,7 @@ asmlinkage int sys32_sigaltstack(nabi_no_regargs struct pt_regs regs)
return ret; return ret;
} }
static int restore_sigcontext32(struct pt_regs *regs, struct sigcontext32 *sc) static int restore_sigcontext32(struct pt_regs *regs, struct sigcontext32 __user *sc)
{ {
u32 used_math; u32 used_math;
int err = 0; int err = 0;
...@@ -420,7 +421,7 @@ struct rt_sigframe32 { ...@@ -420,7 +421,7 @@ struct rt_sigframe32 {
#endif #endif
}; };
int copy_siginfo_to_user32(compat_siginfo_t *to, siginfo_t *from) int copy_siginfo_to_user32(compat_siginfo_t __user *to, siginfo_t *from)
{ {
int err; int err;
...@@ -476,10 +477,10 @@ save_static_function(sys32_sigreturn); ...@@ -476,10 +477,10 @@ save_static_function(sys32_sigreturn);
__attribute_used__ noinline static void __attribute_used__ noinline static void
_sys32_sigreturn(nabi_no_regargs struct pt_regs regs) _sys32_sigreturn(nabi_no_regargs struct pt_regs regs)
{ {
struct sigframe *frame; struct sigframe __user *frame;
sigset_t blocked; sigset_t blocked;
frame = (struct sigframe *) regs.regs[29]; frame = (struct sigframe __user *) regs.regs[29];
if (!access_ok(VERIFY_READ, frame, sizeof(*frame))) if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
goto badframe; goto badframe;
if (__copy_from_user(&blocked, &frame->sf_mask, sizeof(blocked))) if (__copy_from_user(&blocked, &frame->sf_mask, sizeof(blocked)))
...@@ -512,13 +513,13 @@ save_static_function(sys32_rt_sigreturn); ...@@ -512,13 +513,13 @@ save_static_function(sys32_rt_sigreturn);
__attribute_used__ noinline static void __attribute_used__ noinline static void
_sys32_rt_sigreturn(nabi_no_regargs struct pt_regs regs) _sys32_rt_sigreturn(nabi_no_regargs struct pt_regs regs)
{ {
struct rt_sigframe32 *frame; struct rt_sigframe32 __user *frame;
mm_segment_t old_fs; mm_segment_t old_fs;
sigset_t set; sigset_t set;
stack_t st; stack_t st;
s32 sp; s32 sp;
frame = (struct rt_sigframe32 *) regs.regs[29]; frame = (struct rt_sigframe32 __user *) regs.regs[29];
if (!access_ok(VERIFY_READ, frame, sizeof(*frame))) if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
goto badframe; goto badframe;
if (__copy_from_user(&set, &frame->rs_uc.uc_sigmask, sizeof(set))) if (__copy_from_user(&set, &frame->rs_uc.uc_sigmask, sizeof(set)))
...@@ -546,7 +547,7 @@ _sys32_rt_sigreturn(nabi_no_regargs struct pt_regs regs) ...@@ -546,7 +547,7 @@ _sys32_rt_sigreturn(nabi_no_regargs struct pt_regs regs)
call it and ignore errors. */ call it and ignore errors. */
old_fs = get_fs(); old_fs = get_fs();
set_fs (KERNEL_DS); set_fs (KERNEL_DS);
do_sigaltstack(&st, NULL, regs.regs[29]); do_sigaltstack((stack_t __user *)&st, NULL, regs.regs[29]);
set_fs (old_fs); set_fs (old_fs);
/* /*
...@@ -564,7 +565,7 @@ _sys32_rt_sigreturn(nabi_no_regargs struct pt_regs regs) ...@@ -564,7 +565,7 @@ _sys32_rt_sigreturn(nabi_no_regargs struct pt_regs regs)
} }
static inline int setup_sigcontext32(struct pt_regs *regs, static inline int setup_sigcontext32(struct pt_regs *regs,
struct sigcontext32 *sc) struct sigcontext32 __user *sc)
{ {
int err = 0; int err = 0;
...@@ -623,7 +624,8 @@ static inline int setup_sigcontext32(struct pt_regs *regs, ...@@ -623,7 +624,8 @@ static inline int setup_sigcontext32(struct pt_regs *regs,
/* /*
* Determine which stack to use.. * Determine which stack to use..
*/ */
static inline void *get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, static inline void __user *get_sigframe(struct k_sigaction *ka,
struct pt_regs *regs,
size_t frame_size) size_t frame_size)
{ {
unsigned long sp; unsigned long sp;
...@@ -642,13 +644,13 @@ static inline void *get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, ...@@ -642,13 +644,13 @@ static inline void *get_sigframe(struct k_sigaction *ka, struct pt_regs *regs,
if ((ka->sa.sa_flags & SA_ONSTACK) && (sas_ss_flags (sp) == 0)) if ((ka->sa.sa_flags & SA_ONSTACK) && (sas_ss_flags (sp) == 0))
sp = current->sas_ss_sp + current->sas_ss_size; sp = current->sas_ss_sp + current->sas_ss_size;
return (void *)((sp - frame_size) & ALMASK); return (void __user *)((sp - frame_size) & ALMASK);
} }
int setup_frame_32(struct k_sigaction * ka, struct pt_regs *regs, int setup_frame_32(struct k_sigaction * ka, struct pt_regs *regs,
int signr, sigset_t *set) int signr, sigset_t *set)
{ {
struct sigframe *frame; struct sigframe __user *frame;
int err = 0; int err = 0;
frame = get_sigframe(ka, regs, sizeof(*frame)); frame = get_sigframe(ka, regs, sizeof(*frame));
...@@ -702,7 +704,7 @@ int setup_frame_32(struct k_sigaction * ka, struct pt_regs *regs, ...@@ -702,7 +704,7 @@ int setup_frame_32(struct k_sigaction * ka, struct pt_regs *regs,
int setup_rt_frame_32(struct k_sigaction * ka, struct pt_regs *regs, int setup_rt_frame_32(struct k_sigaction * ka, struct pt_regs *regs,
int signr, sigset_t *set, siginfo_t *info) int signr, sigset_t *set, siginfo_t *info)
{ {
struct rt_sigframe32 *frame; struct rt_sigframe32 __user *frame;
int err = 0; int err = 0;
s32 sp; s32 sp;
...@@ -855,7 +857,7 @@ int do_signal32(sigset_t *oldset, struct pt_regs *regs) ...@@ -855,7 +857,7 @@ int do_signal32(sigset_t *oldset, struct pt_regs *regs)
} }
asmlinkage int sys32_rt_sigaction(int sig, const struct sigaction32 *act, asmlinkage int sys32_rt_sigaction(int sig, const struct sigaction32 *act,
struct sigaction32 *oact, struct sigaction32 __user *oact,
unsigned int sigsetsize) unsigned int sigsetsize)
{ {
struct k_sigaction new_sa, old_sa; struct k_sigaction new_sa, old_sa;
...@@ -872,7 +874,7 @@ asmlinkage int sys32_rt_sigaction(int sig, const struct sigaction32 *act, ...@@ -872,7 +874,7 @@ asmlinkage int sys32_rt_sigaction(int sig, const struct sigaction32 *act,
if (!access_ok(VERIFY_READ, act, sizeof(*act))) if (!access_ok(VERIFY_READ, act, sizeof(*act)))
return -EFAULT; return -EFAULT;
err |= __get_user(handler, &act->sa_handler); err |= __get_user(handler, &act->sa_handler);
new_sa.sa.sa_handler = (void*)(s64)handler; new_sa.sa.sa_handler = (void __user *)(s64)handler;
err |= __get_user(new_sa.sa.sa_flags, &act->sa_flags); err |= __get_user(new_sa.sa.sa_flags, &act->sa_flags);
err |= get_sigset(&new_sa.sa.sa_mask, &act->sa_mask); err |= get_sigset(&new_sa.sa.sa_mask, &act->sa_mask);
if (err) if (err)
...@@ -899,7 +901,7 @@ asmlinkage int sys32_rt_sigaction(int sig, const struct sigaction32 *act, ...@@ -899,7 +901,7 @@ asmlinkage int sys32_rt_sigaction(int sig, const struct sigaction32 *act,
} }
asmlinkage int sys32_rt_sigprocmask(int how, compat_sigset_t *set, asmlinkage int sys32_rt_sigprocmask(int how, compat_sigset_t *set,
compat_sigset_t *oset, unsigned int sigsetsize) compat_sigset_t __user *oset, unsigned int sigsetsize)
{ {
sigset_t old_set, new_set; sigset_t old_set, new_set;
int ret; int ret;
...@@ -909,8 +911,9 @@ asmlinkage int sys32_rt_sigprocmask(int how, compat_sigset_t *set, ...@@ -909,8 +911,9 @@ asmlinkage int sys32_rt_sigprocmask(int how, compat_sigset_t *set,
return -EFAULT; return -EFAULT;
set_fs (KERNEL_DS); set_fs (KERNEL_DS);
ret = sys_rt_sigprocmask(how, set ? &new_set : NULL, ret = sys_rt_sigprocmask(how, set ? (sigset_t __user *)&new_set : NULL,
oset ? &old_set : NULL, sigsetsize); oset ? (sigset_t __user *)&old_set : NULL,
sigsetsize);
set_fs (old_fs); set_fs (old_fs);
if (!ret && oset && put_sigset(&old_set, oset)) if (!ret && oset && put_sigset(&old_set, oset))
...@@ -919,7 +922,7 @@ asmlinkage int sys32_rt_sigprocmask(int how, compat_sigset_t *set, ...@@ -919,7 +922,7 @@ asmlinkage int sys32_rt_sigprocmask(int how, compat_sigset_t *set,
return ret; return ret;
} }
asmlinkage int sys32_rt_sigpending(compat_sigset_t *uset, asmlinkage int sys32_rt_sigpending(compat_sigset_t __user *uset,
unsigned int sigsetsize) unsigned int sigsetsize)
{ {
int ret; int ret;
...@@ -927,7 +930,7 @@ asmlinkage int sys32_rt_sigpending(compat_sigset_t *uset, ...@@ -927,7 +930,7 @@ asmlinkage int sys32_rt_sigpending(compat_sigset_t *uset,
mm_segment_t old_fs = get_fs(); mm_segment_t old_fs = get_fs();
set_fs (KERNEL_DS); set_fs (KERNEL_DS);
ret = sys_rt_sigpending(&set, sigsetsize); ret = sys_rt_sigpending((sigset_t __user *)&set, sigsetsize);
set_fs (old_fs); set_fs (old_fs);
if (!ret && put_sigset(&set, uset)) if (!ret && put_sigset(&set, uset))
...@@ -936,7 +939,7 @@ asmlinkage int sys32_rt_sigpending(compat_sigset_t *uset, ...@@ -936,7 +939,7 @@ asmlinkage int sys32_rt_sigpending(compat_sigset_t *uset,
return ret; return ret;
} }
asmlinkage int sys32_rt_sigqueueinfo(int pid, int sig, compat_siginfo_t *uinfo) asmlinkage int sys32_rt_sigqueueinfo(int pid, int sig, compat_siginfo_t __user *uinfo)
{ {
siginfo_t info; siginfo_t info;
int ret; int ret;
...@@ -946,7 +949,7 @@ asmlinkage int sys32_rt_sigqueueinfo(int pid, int sig, compat_siginfo_t *uinfo) ...@@ -946,7 +949,7 @@ asmlinkage int sys32_rt_sigqueueinfo(int pid, int sig, compat_siginfo_t *uinfo)
copy_from_user (info._sifields._pad, uinfo->_sifields._pad, SI_PAD_SIZE)) copy_from_user (info._sifields._pad, uinfo->_sifields._pad, SI_PAD_SIZE))
return -EFAULT; return -EFAULT;
set_fs (KERNEL_DS); set_fs (KERNEL_DS);
ret = sys_rt_sigqueueinfo(pid, sig, &info); ret = sys_rt_sigqueueinfo(pid, sig, (siginfo_t __user *)&info);
set_fs (old_fs); set_fs (old_fs);
return ret; return ret;
} }
......
...@@ -83,12 +83,12 @@ save_static_function(sysn32_rt_sigreturn); ...@@ -83,12 +83,12 @@ save_static_function(sysn32_rt_sigreturn);
__attribute_used__ noinline static void __attribute_used__ noinline static void
_sysn32_rt_sigreturn(nabi_no_regargs struct pt_regs regs) _sysn32_rt_sigreturn(nabi_no_regargs struct pt_regs regs)
{ {
struct rt_sigframe_n32 *frame; struct rt_sigframe_n32 __user *frame;
sigset_t set; sigset_t set;
stack_t st; stack_t st;
s32 sp; s32 sp;
frame = (struct rt_sigframe_n32 *) regs.regs[29]; frame = (struct rt_sigframe_n32 __user *) regs.regs[29];
if (!access_ok(VERIFY_READ, frame, sizeof(*frame))) if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
goto badframe; goto badframe;
if (__copy_from_user(&set, &frame->rs_uc.uc_sigmask, sizeof(set))) if (__copy_from_user(&set, &frame->rs_uc.uc_sigmask, sizeof(set)))
...@@ -114,7 +114,7 @@ _sysn32_rt_sigreturn(nabi_no_regargs struct pt_regs regs) ...@@ -114,7 +114,7 @@ _sysn32_rt_sigreturn(nabi_no_regargs struct pt_regs regs)
/* It is more difficult to avoid calling this function than to /* It is more difficult to avoid calling this function than to
call it and ignore errors. */ call it and ignore errors. */
do_sigaltstack(&st, NULL, regs.regs[29]); do_sigaltstack((stack_t __user *)&st, NULL, regs.regs[29]);
/* /*
* Don't let your children do this ... * Don't let your children do this ...
...@@ -133,7 +133,7 @@ _sysn32_rt_sigreturn(nabi_no_regargs struct pt_regs regs) ...@@ -133,7 +133,7 @@ _sysn32_rt_sigreturn(nabi_no_regargs struct pt_regs regs)
int setup_rt_frame_n32(struct k_sigaction * ka, int setup_rt_frame_n32(struct k_sigaction * ka,
struct pt_regs *regs, int signr, sigset_t *set, siginfo_t *info) struct pt_regs *regs, int signr, sigset_t *set, siginfo_t *info)
{ {
struct rt_sigframe_n32 *frame; struct rt_sigframe_n32 __user *frame;
int err = 0; int err = 0;
s32 sp; s32 sp;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment