1 /**************************************************************************
2 *
3 * Copyright 2015 Advanced Micro Devices, Inc.
4 * Copyright 2008 VMware, Inc.
5 * All Rights Reserved.
6 *
7 * Permission is hereby granted, free of charge, to any person obtaining a
8 * copy of this software and associated documentation files (the "Software"),
9 * to deal in the Software without restriction, including without limitation
10 * on the rights to use, copy, modify, merge, publish, distribute, sub
11 * license, and/or sell copies of the Software, and to permit persons to whom
12 * the Software is furnished to do so, subject to the following conditions:
13 *
14 * The above copyright notice and this permission notice (including the next
15 * paragraph) shall be included in all copies or substantial portions of the
16 * Software.
17 *
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
21 * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
22 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
23 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
24 * USE OR OTHER DEALINGS IN THE SOFTWARE.
25 *
26 **************************************************************************/
27
28 #ifndef DD_UTIL_H
29 #define DD_UTIL_H
30
31 #include <stdio.h>
32 #include <errno.h>
33 #include <unistd.h>
34 #include <sys/stat.h>
35
36 #include "c99_alloca.h"
37 #include "os/os_process.h"
38 #include "util/u_atomic.h"
39 #include "util/u_debug.h"
40
41 /* name of the directory in home */
42 #define DD_DIR "ddebug_dumps"
43
44 static inline void
dd_get_debug_filename_and_mkdir(char * buf,size_t buflen,bool verbose)45 dd_get_debug_filename_and_mkdir(char *buf, size_t buflen, bool verbose)
46 {
47 static unsigned index;
48 char proc_name[128], dir[256];
49
50 if (!os_get_process_name(proc_name, sizeof(proc_name))) {
51 fprintf(stderr, "dd: can't get the process name\n");
52 strcpy(proc_name, "unknown");
53 }
54
55 snprintf(dir, sizeof(dir), "%s/"DD_DIR, debug_get_option("HOME", "."));
56
57 if (mkdir(dir, 0774) && errno != EEXIST)
58 fprintf(stderr, "dd: can't create a directory (%i)\n", errno);
59
60 snprintf(buf, buflen, "%s/%s_%u_%08u", dir, proc_name, getpid(),
61 p_atomic_inc_return(&index) - 1);
62
63 if (verbose)
64 fprintf(stderr, "dd: dumping to file %s\n", buf);
65 }
66
67 static inline FILE *
dd_get_debug_file(bool verbose)68 dd_get_debug_file(bool verbose)
69 {
70 char name[512];
71 FILE *f;
72
73 dd_get_debug_filename_and_mkdir(name, sizeof(name), verbose);
74 f = fopen(name, "w");
75 if (!f) {
76 fprintf(stderr, "dd: can't open file %s\n", name);
77 return NULL;
78 }
79
80 return f;
81 }
82
83 static inline void
dd_parse_apitrace_marker(const char * string,int len,unsigned * call_number)84 dd_parse_apitrace_marker(const char *string, int len, unsigned *call_number)
85 {
86 unsigned num;
87 char *s;
88
89 if (len <= 0)
90 return;
91
92 /* Make it zero-terminated. */
93 s = alloca(len + 1);
94 memcpy(s, string, len);
95 s[len] = 0;
96
97 /* Parse the number. */
98 errno = 0;
99 num = strtol(s, NULL, 10);
100 if (errno)
101 return;
102
103 *call_number = num;
104 }
105
106 #endif /* DD_UTIL_H */
107