2 * Copyright (c) 2015 Cisco and/or its affiliates.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at:
7 * http://www.apache.org/licenses/LICENSE-2.0
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
16 Copyright (c) 2005 Eliot Dresselhaus
18 Permission is hereby granted, free of charge, to any person obtaining
19 a copy of this software and associated documentation files (the
20 "Software"), to deal in the Software without restriction, including
21 without limitation the rights to use, copy, modify, merge, publish,
22 distribute, sublicense, and/or sell copies of the Software, and to
23 permit persons to whom the Software is furnished to do so, subject to
24 the following conditions:
26 The above copyright notice and this permission notice shall be
27 included in all copies or substantial portions of the Software.
29 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
30 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
31 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
32 NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
33 LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
34 OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
35 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
38 #include <vppinfra/error.h>
39 #include <vppinfra/os.h>
40 #include <vppinfra/bitmap.h>
41 #include <vppinfra/unix.h>
42 #include <vppinfra/format.h>
44 #include <vppinfra/linux/sysfs.h>
48 #include <sys/types.h>
49 #include <sys/uio.h> /* writev */
51 #include <stdio.h> /* for sprintf */
54 __clib_export __thread uword __os_thread_index = 0;
55 __clib_export __thread uword __os_numa_index = 0;
58 clib_file_n_bytes (char *file, uword * result)
62 if (stat (file, &s) < 0)
63 return clib_error_return_unix (0, "stat `%s'", file);
65 if (S_ISREG (s.st_mode))
70 return /* no error */ 0;
74 clib_file_read_contents (char *file, u8 * result, uword n_bytes)
78 clib_error_t *error = 0;
81 if ((fd = open (file, 0)) < 0)
82 return clib_error_return_unix (0, "open `%s'", file);
89 if ((n_read = read (fd, v + n_done, n_left)) < 0)
91 error = clib_error_return_unix (0, "open `%s'", file);
106 clib_error_return (0,
107 " `%s' expected to read %wd bytes; read only %wd",
108 file, n_bytes, n_bytes - n_left);
117 __clib_export clib_error_t *
118 clib_file_contents (char *file, u8 ** result)
121 clib_error_t *error = 0;
124 if ((error = clib_file_n_bytes (file, &n_bytes)))
128 vec_resize (v, n_bytes);
130 error = clib_file_read_contents (file, v, n_bytes);
141 clib_file_get_resolved_basename (char *fmt, ...)
144 char *p, buffer[PATH_MAX];
149 link = va_format (0, fmt, &va);
153 r = readlink ((char *) link, buffer, sizeof (buffer) - 1);
161 while (p > buffer && p[-1] != '/')
165 vec_add1 (s, p++[0]);
172 unix_proc_file_contents (char *file, u8 ** result)
178 /* Unfortunately, stat(/proc/XXX) returns zero... */
179 fd = open (file, O_RDONLY);
182 return clib_error_return_unix (0, "open `%s'", file);
184 vec_validate (rv, 4095);
188 bytes = read (fd, rv + pos, 4096);
193 return clib_error_return_unix (0, "read '%s'", file);
198 vec_set_len (rv, pos);
202 vec_validate (rv, pos + 4095);
209 void os_panic (void) __attribute__ ((weak));
217 void os_exit (int) __attribute__ ((weak));
225 void os_puts (u8 * string, uword string_length, uword is_error)
226 __attribute__ ((weak));
229 os_puts (u8 * string, uword string_length, uword is_error)
231 int cpu = os_get_thread_index ();
232 int nthreads = os_get_nthreads ();
234 int fd = is_error ? 2 : 1;
235 struct iovec iovs[2];
240 snprintf (buf, sizeof (buf), "%d: ", cpu);
242 iovs[n_iovs].iov_base = buf;
243 iovs[n_iovs].iov_len = strlen (buf);
247 iovs[n_iovs].iov_base = string;
248 iovs[n_iovs].iov_len = string_length;
251 if (writev (fd, iovs, n_iovs) < 0)
255 __clib_export __clib_weak void
256 os_out_of_memory (void)
261 __clib_export __clib_weak uword
262 os_get_nthreads (void)
267 __clib_export clib_bitmap_t *
268 os_get_online_cpu_core_bitmap ()
271 return clib_sysfs_read_bitmap ("/sys/devices/system/cpu/online");
277 __clib_export clib_bitmap_t *
278 os_get_online_cpu_node_bitmap ()
281 return clib_sysfs_read_bitmap ("/sys/devices/system/node/online");
286 __clib_export clib_bitmap_t *
287 os_get_cpu_on_node_bitmap (int node)
290 return clib_sysfs_read_bitmap ("/sys/devices/system/node/node%u/cpulist",
297 __clib_export clib_bitmap_t *
298 os_get_cpu_with_memory_bitmap ()
301 return clib_sysfs_read_bitmap ("/sys/devices/system/node/has_memory");
308 os_get_cpu_phys_core_id (int cpu_id)
316 format (0, "/sys/devices/system/cpu/cpu%u/topology/core_id%c", cpu_id, 0);
317 err = clib_sysfs_read ((char *) p, "%d", &core_id);
321 clib_error_free (err);
331 * fd.io coding-style-patch-verification: ON
334 * eval: (c-set-style "gnu")