Commit df2e71fb9115a8d4f721fb1464db09adc8332bc5

Authored by akpm@osdl.org
Committed by Linus Torvalds
1 parent be4f1bb262

[PATCH] dump_thread() cleanup

)

From: Adrian Bunk <bunk@stusta.de>

- create one common dump_thread() prototype in kernel.h

- dump_thread() is only used in fs/binfmt_aout.c and can therefore be
  removed on all architectures where CONFIG_BINFMT_AOUT is not
  available

Signed-off-by: Adrian Bunk <bunk@stusta.de>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>

Showing 28 changed files with 5 additions and 250 deletions Side-by-side Diff

arch/alpha/kernel/alpha_ksyms.c
... ... @@ -40,7 +40,6 @@
40 40 #include <asm/unistd.h>
41 41  
42 42 extern struct hwrpb_struct *hwrpb;
43   -extern void dump_thread(struct pt_regs *, struct user *);
44 43 extern spinlock_t rtc_lock;
45 44  
46 45 /* these are C runtime functions with special calling conventions: */
arch/alpha/mm/init.c
... ... @@ -7,6 +7,7 @@
7 7 /* 2.3.x zone allocator, 1999 Andrea Arcangeli <andrea@suse.de> */
8 8  
9 9 #include <linux/config.h>
  10 +#include <linux/pagemap.h>
10 11 #include <linux/signal.h>
11 12 #include <linux/sched.h>
12 13 #include <linux/kernel.h>
arch/arm26/kernel/armksyms.c
... ... @@ -35,7 +35,6 @@
35 35 #include <asm/checksum.h>
36 36 #include <asm/mach-types.h>
37 37  
38   -extern void dump_thread(struct pt_regs *, struct user *);
39 38 extern int dump_fpu(struct pt_regs *, struct user_fp_struct *);
40 39 extern void inswb(unsigned int port, void *to, int len);
41 40 extern void outswb(unsigned int port, const void *to, int len);
arch/cris/kernel/crisksyms.c
... ... @@ -21,7 +21,6 @@
21 21 #include <asm/pgtable.h>
22 22 #include <asm/fasttimer.h>
23 23  
24   -extern void dump_thread(struct pt_regs *, struct user *);
25 24 extern unsigned long get_cmos_time(void);
26 25 extern void __Udiv(void);
27 26 extern void __Umod(void);
... ... @@ -33,7 +32,6 @@
33 32 extern void iounmap(volatile void * __iomem);
34 33  
35 34 /* Platform dependent support */
36   -EXPORT_SYMBOL(dump_thread);
37 35 EXPORT_SYMBOL(kernel_thread);
38 36 EXPORT_SYMBOL(get_cmos_time);
39 37 EXPORT_SYMBOL(loops_per_usec);
arch/cris/kernel/process.c
... ... @@ -257,34 +257,6 @@
257 257 {
258 258 }
259 259  
260   -/*
261   - * fill in the user structure for a core dump..
262   - */
263   -void dump_thread(struct pt_regs * regs, struct user * dump)
264   -{
265   -#if 0
266   - int i;
267   -
268   - /* changed the size calculations - should hopefully work better. lbt */
269   - dump->magic = CMAGIC;
270   - dump->start_code = 0;
271   - dump->start_stack = regs->esp & ~(PAGE_SIZE - 1);
272   - dump->u_tsize = ((unsigned long) current->mm->end_code) >> PAGE_SHIFT;
273   - dump->u_dsize = ((unsigned long) (current->mm->brk + (PAGE_SIZE-1))) >> PAGE_SHIFT;
274   - dump->u_dsize -= dump->u_tsize;
275   - dump->u_ssize = 0;
276   - for (i = 0; i < 8; i++)
277   - dump->u_debugreg[i] = current->debugreg[i];
278   -
279   - if (dump->start_stack < TASK_SIZE)
280   - dump->u_ssize = ((unsigned long) (TASK_SIZE - dump->start_stack)) >> PAGE_SHIFT;
281   -
282   - dump->regs = *regs;
283   -
284   - dump->u_fpvalid = dump_fpu (regs, &dump->i387);
285   -#endif
286   -}
287   -
288 260 /* Fill in the fpu structure for a core dump. */
289 261 int dump_fpu(struct pt_regs *regs, elf_fpregset_t *fpu)
290 262 {
arch/frv/kernel/frv_ksyms.c
... ... @@ -18,7 +18,6 @@
18 18 #include <asm/hardirq.h>
19 19 #include <asm/cacheflush.h>
20 20  
21   -extern void dump_thread(struct pt_regs *, struct user *);
22 21 extern long __memcpy_user(void *dst, const void *src, size_t count);
23 22 extern long __memset_user(void *dst, const void *src, size_t count);
24 23  
... ... @@ -27,7 +26,6 @@
27 26 EXPORT_SYMBOL(__ioremap);
28 27 EXPORT_SYMBOL(iounmap);
29 28  
30   -EXPORT_SYMBOL(dump_thread);
31 29 EXPORT_SYMBOL(strnlen);
32 30 EXPORT_SYMBOL(strrchr);
33 31 EXPORT_SYMBOL(strstr);
arch/frv/kernel/process.c
... ... @@ -244,28 +244,6 @@
244 244 } /* end copy_thread() */
245 245  
246 246 /*
247   - * fill in the user structure for a core dump..
248   - */
249   -void dump_thread(struct pt_regs *regs, struct user *dump)
250   -{
251   -#if 0
252   - /* changed the size calculations - should hopefully work better. lbt */
253   - dump->magic = CMAGIC;
254   - dump->start_code = 0;
255   - dump->start_stack = user_stack(regs) & ~(PAGE_SIZE - 1);
256   - dump->u_tsize = ((unsigned long) current->mm->end_code) >> PAGE_SHIFT;
257   - dump->u_dsize = ((unsigned long) (current->mm->brk + (PAGE_SIZE-1))) >> PAGE_SHIFT;
258   - dump->u_dsize -= dump->u_tsize;
259   - dump->u_ssize = 0;
260   -
261   - if (dump->start_stack < TASK_SIZE)
262   - dump->u_ssize = ((unsigned long) (TASK_SIZE - dump->start_stack)) >> PAGE_SHIFT;
263   -
264   - dump->regs = *(struct user_context *) regs;
265   -#endif
266   -}
267   -
268   -/*
269 247 * sys_execve() executes a new program.
270 248 */
271 249 asmlinkage int sys_execve(char *name, char **argv, char **envp)
arch/h8300/kernel/h8300_ksyms.c
... ... @@ -22,11 +22,8 @@
22 22 //asmlinkage long long __lshrdi3 (long long, int);
23 23 extern char h8300_debug_device[];
24 24  
25   -extern void dump_thread(struct pt_regs *, struct user *);
26   -
27 25 /* platform dependent support */
28 26  
29   -EXPORT_SYMBOL(dump_thread);
30 27 EXPORT_SYMBOL(strnlen);
31 28 EXPORT_SYMBOL(strrchr);
32 29 EXPORT_SYMBOL(strstr);
arch/h8300/kernel/process.c
... ... @@ -208,34 +208,6 @@
208 208 }
209 209  
210 210 /*
211   - * fill in the user structure for a core dump..
212   - */
213   -void dump_thread(struct pt_regs * regs, struct user * dump)
214   -{
215   -/* changed the size calculations - should hopefully work better. lbt */
216   - dump->magic = CMAGIC;
217   - dump->start_code = 0;
218   - dump->start_stack = rdusp() & ~(PAGE_SIZE - 1);
219   - dump->u_tsize = ((unsigned long) current->mm->end_code) >> PAGE_SHIFT;
220   - dump->u_dsize = ((unsigned long) (current->mm->brk +
221   - (PAGE_SIZE-1))) >> PAGE_SHIFT;
222   - dump->u_dsize -= dump->u_tsize;
223   - dump->u_ssize = 0;
224   -
225   - dump->u_ar0 = (struct user_regs_struct *)(((int)(&dump->regs)) -((int)(dump)));
226   - dump->regs.er0 = regs->er0;
227   - dump->regs.er1 = regs->er1;
228   - dump->regs.er2 = regs->er2;
229   - dump->regs.er3 = regs->er3;
230   - dump->regs.er4 = regs->er4;
231   - dump->regs.er5 = regs->er5;
232   - dump->regs.er6 = regs->er6;
233   - dump->regs.orig_er0 = regs->orig_er0;
234   - dump->regs.ccr = regs->ccr;
235   - dump->regs.pc = regs->pc;
236   -}
237   -
238   -/*
239 211 * sys_execve() executes a new program.
240 212 */
241 213 asmlinkage int sys_execve(char *name, char **argv, char **envp,int dummy,...)
arch/m32r/kernel/m32r_ksyms.c
... ... @@ -18,8 +18,6 @@
18 18 #include <asm/irq.h>
19 19 #include <asm/tlbflush.h>
20 20  
21   -extern void dump_thread(struct pt_regs *, struct user *);
22   -
23 21 #if defined(CONFIG_BLK_DEV_IDE) || defined(CONFIG_BLK_DEV_HD) || defined(CONFIG_BLK_DEV_IDE_MODULE) || defined(CONFIG_BLK_DEV_HD_MODULE)
24 22 extern struct drive_info_struct drive_info;
25 23 EXPORT_SYMBOL(drive_info);
... ... @@ -27,7 +25,6 @@
27 25  
28 26 /* platform dependent support */
29 27 EXPORT_SYMBOL(boot_cpu_data);
30   -EXPORT_SYMBOL(dump_thread);
31 28 EXPORT_SYMBOL(dump_fpu);
32 29 EXPORT_SYMBOL(__ioremap);
33 30 EXPORT_SYMBOL(iounmap);
arch/m32r/kernel/process.c
... ... @@ -261,14 +261,6 @@
261 261 }
262 262  
263 263 /*
264   - * fill in the user structure for a core dump..
265   - */
266   -void dump_thread(struct pt_regs * regs, struct user * dump)
267   -{
268   - /* M32R_FIXME */
269   -}
270   -
271   -/*
272 264 * Capture the user space registers if the task is not running (in user space)
273 265 */
274 266 int dump_task_regs(struct task_struct *tsk, elf_gregset_t *regs)
arch/m68k/kernel/m68k_ksyms.c
... ... @@ -23,8 +23,6 @@
23 23 asmlinkage long long __muldi3 (long long, long long);
24 24 extern char m68k_debug_device[];
25 25  
26   -extern void dump_thread(struct pt_regs *, struct user *);
27   -
28 26 /* platform dependent support */
29 27  
30 28 EXPORT_SYMBOL(m68k_machtype);
arch/m68knommu/kernel/m68k_ksyms.c
... ... @@ -18,7 +18,6 @@
18 18 #include <asm/checksum.h>
19 19 #include <asm/current.h>
20 20  
21   -extern void dump_thread(struct pt_regs *, struct user *);
22 21 extern int dump_fpu(struct pt_regs *, elf_fpregset_t *);
23 22  
24 23 /* platform dependent support */
... ... @@ -26,7 +25,6 @@
26 25 EXPORT_SYMBOL(__ioremap);
27 26 EXPORT_SYMBOL(iounmap);
28 27 EXPORT_SYMBOL(dump_fpu);
29   -EXPORT_SYMBOL(dump_thread);
30 28 EXPORT_SYMBOL(strnlen);
31 29 EXPORT_SYMBOL(strrchr);
32 30 EXPORT_SYMBOL(strstr);
arch/m68knommu/kernel/process.c
... ... @@ -276,52 +276,6 @@
276 276 }
277 277  
278 278 /*
279   - * fill in the user structure for a core dump..
280   - */
281   -void dump_thread(struct pt_regs * regs, struct user * dump)
282   -{
283   - struct switch_stack *sw;
284   -
285   - /* changed the size calculations - should hopefully work better. lbt */
286   - dump->magic = CMAGIC;
287   - dump->start_code = 0;
288   - dump->start_stack = rdusp() & ~(PAGE_SIZE - 1);
289   - dump->u_tsize = ((unsigned long) current->mm->end_code) >> PAGE_SHIFT;
290   - dump->u_dsize = ((unsigned long) (current->mm->brk +
291   - (PAGE_SIZE-1))) >> PAGE_SHIFT;
292   - dump->u_dsize -= dump->u_tsize;
293   - dump->u_ssize = 0;
294   -
295   - if (dump->start_stack < TASK_SIZE)
296   - dump->u_ssize = ((unsigned long) (TASK_SIZE - dump->start_stack)) >> PAGE_SHIFT;
297   -
298   - dump->u_ar0 = (struct user_regs_struct *)((int)&dump->regs - (int)dump);
299   - sw = ((struct switch_stack *)regs) - 1;
300   - dump->regs.d1 = regs->d1;
301   - dump->regs.d2 = regs->d2;
302   - dump->regs.d3 = regs->d3;
303   - dump->regs.d4 = regs->d4;
304   - dump->regs.d5 = regs->d5;
305   - dump->regs.d6 = sw->d6;
306   - dump->regs.d7 = sw->d7;
307   - dump->regs.a0 = regs->a0;
308   - dump->regs.a1 = regs->a1;
309   - dump->regs.a2 = regs->a2;
310   - dump->regs.a3 = sw->a3;
311   - dump->regs.a4 = sw->a4;
312   - dump->regs.a5 = sw->a5;
313   - dump->regs.a6 = sw->a6;
314   - dump->regs.d0 = regs->d0;
315   - dump->regs.orig_d0 = regs->orig_d0;
316   - dump->regs.stkadj = regs->stkadj;
317   - dump->regs.sr = regs->sr;
318   - dump->regs.pc = regs->pc;
319   - dump->regs.fmtvec = (regs->format << 12) | regs->vector;
320   - /* dump floating point stuff */
321   - dump->u_fpvalid = dump_fpu (regs, &dump->m68kfp);
322   -}
323   -
324   -/*
325 279 * Generic dumping code. Used for panic and debug.
326 280 */
327 281 void dump(struct pt_regs *fp)
arch/s390/kernel/process.c
... ... @@ -352,27 +352,6 @@
352 352 return 1;
353 353 }
354 354  
355   -/*
356   - * fill in the user structure for a core dump..
357   - */
358   -void dump_thread(struct pt_regs * regs, struct user * dump)
359   -{
360   -
361   -/* changed the size calculations - should hopefully work better. lbt */
362   - dump->magic = CMAGIC;
363   - dump->start_code = 0;
364   - dump->start_stack = regs->gprs[15] & ~(PAGE_SIZE - 1);
365   - dump->u_tsize = current->mm->end_code >> PAGE_SHIFT;
366   - dump->u_dsize = (current->mm->brk + PAGE_SIZE - 1) >> PAGE_SHIFT;
367   - dump->u_dsize -= dump->u_tsize;
368   - dump->u_ssize = 0;
369   - if (dump->start_stack < TASK_SIZE)
370   - dump->u_ssize = (TASK_SIZE - dump->start_stack) >> PAGE_SHIFT;
371   - memcpy(&dump->regs, regs, sizeof(s390_regs));
372   - dump_fpu (regs, &dump->regs.fp_regs);
373   - dump->regs.per_info = current->thread.per_info;
374   -}
375   -
376 355 unsigned long get_wchan(struct task_struct *p)
377 356 {
378 357 struct stack_frame *sf, *low, *high;
arch/sh/kernel/process.c
... ... @@ -305,26 +305,6 @@
305 305 return 0;
306 306 }
307 307  
308   -/*
309   - * fill in the user structure for a core dump..
310   - */
311   -void dump_thread(struct pt_regs * regs, struct user * dump)
312   -{
313   - dump->magic = CMAGIC;
314   - dump->start_code = current->mm->start_code;
315   - dump->start_data = current->mm->start_data;
316   - dump->start_stack = regs->regs[15] & ~(PAGE_SIZE - 1);
317   - dump->u_tsize = (current->mm->end_code - dump->start_code) >> PAGE_SHIFT;
318   - dump->u_dsize = (current->mm->brk + (PAGE_SIZE-1) - dump->start_data) >> PAGE_SHIFT;
319   - dump->u_ssize = (current->mm->start_stack - dump->start_stack +
320   - PAGE_SIZE - 1) >> PAGE_SHIFT;
321   - /* Debug registers will come here. */
322   -
323   - dump->regs = *regs;
324   -
325   - dump->u_fpvalid = dump_fpu(regs, &dump->fpu);
326   -}
327   -
328 308 /* Tracing by user break controller. */
329 309 static void
330 310 ubc_set_tracing(int asid, unsigned long pc)
arch/sh/kernel/sh_ksyms.c
... ... @@ -21,14 +21,12 @@
21 21 #include <asm/cacheflush.h>
22 22 #include <asm/checksum.h>
23 23  
24   -extern void dump_thread(struct pt_regs *, struct user *);
25 24 extern int dump_fpu(struct pt_regs *, elf_fpregset_t *);
26 25 extern struct hw_interrupt_type no_irq_type;
27 26  
28 27 EXPORT_SYMBOL(sh_mv);
29 28  
30 29 /* platform dependent support */
31   -EXPORT_SYMBOL(dump_thread);
32 30 EXPORT_SYMBOL(dump_fpu);
33 31 EXPORT_SYMBOL(iounmap);
34 32 EXPORT_SYMBOL(enable_irq);
arch/sh64/kernel/process.c
... ... @@ -775,26 +775,6 @@
775 775 return 0;
776 776 }
777 777  
778   -/*
779   - * fill in the user structure for a core dump..
780   - */
781   -void dump_thread(struct pt_regs * regs, struct user * dump)
782   -{
783   - dump->magic = CMAGIC;
784   - dump->start_code = current->mm->start_code;
785   - dump->start_data = current->mm->start_data;
786   - dump->start_stack = regs->regs[15] & ~(PAGE_SIZE - 1);
787   - dump->u_tsize = (current->mm->end_code - dump->start_code) >> PAGE_SHIFT;
788   - dump->u_dsize = (current->mm->brk + (PAGE_SIZE-1) - dump->start_data) >> PAGE_SHIFT;
789   - dump->u_ssize = (current->mm->start_stack - dump->start_stack +
790   - PAGE_SIZE - 1) >> PAGE_SHIFT;
791   - /* Debug registers will come here. */
792   -
793   - dump->regs = *regs;
794   -
795   - dump->u_fpvalid = dump_fpu(regs, &dump->fpu);
796   -}
797   -
798 778 asmlinkage int sys_fork(unsigned long r2, unsigned long r3,
799 779 unsigned long r4, unsigned long r5,
800 780 unsigned long r6, unsigned long r7,
arch/sh64/kernel/sh_ksyms.c
... ... @@ -29,7 +29,6 @@
29 29 #include <asm/delay.h>
30 30 #include <asm/irq.h>
31 31  
32   -extern void dump_thread(struct pt_regs *, struct user *);
33 32 extern int dump_fpu(struct pt_regs *, elf_fpregset_t *);
34 33  
35 34 #if 0
... ... @@ -41,7 +40,6 @@
41 40 #endif
42 41  
43 42 /* platform dependent support */
44   -EXPORT_SYMBOL(dump_thread);
45 43 EXPORT_SYMBOL(dump_fpu);
46 44 EXPORT_SYMBOL(iounmap);
47 45 EXPORT_SYMBOL(enable_irq);
arch/sparc/kernel/sparc_ksyms.c
... ... @@ -82,8 +82,6 @@
82 82 extern int __muldi3(int, int);
83 83 extern int __divdi3(int, int);
84 84  
85   -extern void dump_thread(struct pt_regs *, struct user *);
86   -
87 85 /* Private functions with odd calling conventions. */
88 86 extern void ___atomic24_add(void);
89 87 extern void ___atomic24_sub(void);
arch/sparc64/kernel/binfmt_aout32.c
... ... @@ -36,8 +36,6 @@
36 36 static int load_aout32_library(struct file*);
37 37 static int aout32_core_dump(long signr, struct pt_regs * regs, struct file *file);
38 38  
39   -extern void dump_thread(struct pt_regs *, struct user *);
40   -
41 39 static struct linux_binfmt aout32_format = {
42 40 NULL, THIS_MODULE, load_aout32_binary, load_aout32_library, aout32_core_dump,
43 41 PAGE_SIZE
arch/sparc64/kernel/sparc64_ksyms.c
... ... @@ -94,7 +94,6 @@
94 94  
95 95 extern int __ashrdi3(int, int);
96 96  
97   -extern void dump_thread(struct pt_regs *, struct user *);
98 97 extern int dump_fpu (struct pt_regs * regs, elf_fpregset_t * fpregs);
99 98  
100 99 extern unsigned long phys_base;
... ... @@ -241,7 +240,6 @@
241 240 EXPORT_SYMBOL(_sigpause_common);
242 241 EXPORT_SYMBOL(verify_compat_iovec);
243 242  
244   -EXPORT_SYMBOL(dump_thread);
245 243 EXPORT_SYMBOL(dump_fpu);
246 244 EXPORT_SYMBOL(pte_alloc_one_kernel);
247 245 #ifndef CONFIG_SMP
arch/v850/kernel/process.c
... ... @@ -164,30 +164,6 @@
164 164 }
165 165  
166 166 /*
167   - * fill in the user structure for a core dump..
168   - */
169   -void dump_thread (struct pt_regs *regs, struct user *dump)
170   -{
171   -#if 0 /* Later. XXX */
172   - dump->magic = CMAGIC;
173   - dump->start_code = 0;
174   - dump->start_stack = regs->gpr[GPR_SP];
175   - dump->u_tsize = ((unsigned long) current->mm->end_code) >> PAGE_SHIFT;
176   - dump->u_dsize = ((unsigned long) (current->mm->brk +
177   - (PAGE_SIZE-1))) >> PAGE_SHIFT;
178   - dump->u_dsize -= dump->u_tsize;
179   - dump->u_ssize = 0;
180   -
181   - if (dump->start_stack < TASK_SIZE)
182   - dump->u_ssize = ((unsigned long) (TASK_SIZE - dump->start_stack)) >> PAGE_SHIFT;
183   -
184   - dump->u_ar0 = (struct user_regs_struct *)((int)&dump->regs - (int)dump);
185   - dump->regs = *regs;
186   - dump->u_fpvalid = 0;
187   -#endif
188   -}
189   -
190   -/*
191 167 * sys_execve() executes a new program.
192 168 */
193 169 int sys_execve (char *name, char **argv, char **envp, struct pt_regs *regs)
arch/v850/kernel/v850_ksyms.c
... ... @@ -21,8 +21,6 @@
21 21 EXPORT_SYMBOL (trap_table);
22 22  
23 23 /* platform dependent support */
24   -extern void dump_thread (struct pt_regs *, struct user *);
25   -EXPORT_SYMBOL (dump_thread);
26 24 EXPORT_SYMBOL (kernel_thread);
27 25 EXPORT_SYMBOL (enable_irq);
28 26 EXPORT_SYMBOL (disable_irq);
... ... @@ -33,8 +33,6 @@
33 33 static int load_aout_library(struct file*);
34 34 static int aout_core_dump(long signr, struct pt_regs * regs, struct file *file);
35 35  
36   -extern void dump_thread(struct pt_regs *, struct user *);
37   -
38 36 static struct linux_binfmt aout_format = {
39 37 .module = THIS_MODULE,
40 38 .load_binary = load_aout_binary,
... ... @@ -77,8 +77,6 @@
77 77 static int load_flat_binary(struct linux_binprm *, struct pt_regs * regs);
78 78 static int flat_core_dump(long signr, struct pt_regs * regs, struct file *file);
79 79  
80   -extern void dump_thread(struct pt_regs *, struct user *);
81   -
82 80 static struct linux_binfmt flat_format = {
83 81 .module = THIS_MODULE,
84 82 .load_binary = load_flat_binary,
include/asm-um/processor-generic.h
... ... @@ -89,7 +89,6 @@
89 89  
90 90 extern void release_thread(struct task_struct *);
91 91 extern int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags);
92   -extern void dump_thread(struct pt_regs *regs, struct user *u);
93 92  
94 93 static inline void prepare_to_copy(struct task_struct *tsk)
95 94 {
include/linux/kernel.h
... ... @@ -47,6 +47,8 @@
47 47 #define default_console_loglevel (console_printk[3])
48 48  
49 49 struct completion;
  50 +struct pt_regs;
  51 +struct user;
50 52  
51 53 /**
52 54 * might_sleep - annotation for functions that can sleep
... ... @@ -122,6 +124,8 @@
122 124 extern int __kernel_text_address(unsigned long addr);
123 125 extern int kernel_text_address(unsigned long addr);
124 126 extern int session_of_pgrp(int pgrp);
  127 +
  128 +extern void dump_thread(struct pt_regs *regs, struct user *dump);
125 129  
126 130 #ifdef CONFIG_PRINTK
127 131 asmlinkage int vprintk(const char *fmt, va_list args)