Changes in / [dc5aa568:13c4fe0] in mainline
- Files:
-
- 14 deleted
- 15 edited
Legend:
- Unmodified
- Added
- Removed
-
boot/Makefile.common
rdc5aa568 r13c4fe0 74 74 $(USPACE_PATH)/srv/locsrv/locsrv \ 75 75 $(USPACE_PATH)/srv/bd/rd/rd \ 76 $(USPACE_PATH)/srv/vfs/vfs \ 77 $(USPACE_PATH)/srv/logger/logger 76 $(USPACE_PATH)/srv/vfs/vfs 78 77 79 78 ifeq ($(RDFMT),tmpfs) … … 166 165 $(USPACE_PATH)/app/killall/killall \ 167 166 $(USPACE_PATH)/app/loc/loc \ 168 $(USPACE_PATH)/app/logset/logset \169 167 $(USPACE_PATH)/app/mkfat/mkfat \ 170 168 $(USPACE_PATH)/app/mkexfat/mkexfat \ -
kernel/genarch/include/multiboot/multiboot.h
rdc5aa568 r13c4fe0 99 99 100 100 extern void multiboot_extract_command(char *, size_t, const char *); 101 extern void multiboot_extract_argument(char *, size_t, const char *);102 101 extern void multiboot_info_parse(uint32_t, const multiboot_info_t *); 103 102 -
kernel/genarch/src/multiboot/multiboot.c
rdc5aa568 r13c4fe0 71 71 } 72 72 73 /** Extract arguments from the multiboot module command line.74 *75 * @param buf Destination buffer (will be always NULL-terminated).76 * @param size Size of destination buffer (in bytes).77 * @param cmd_line Input string (the command line).78 *79 */80 void multiboot_extract_argument(char *buf, size_t size, const char *cmd_line)81 {82 /* Start after first space. */83 const char *start = str_chr(cmd_line, ' ');84 if (start == NULL) {85 str_cpy(buf, size, "");86 return;87 }88 89 const char *end = cmd_line + str_size(cmd_line);90 91 /* Skip the space(s). */92 while (start != end) {93 if (start[0] == ' ')94 start++;95 else96 break;97 }98 99 str_ncpy(buf, size, start, (size_t) (end - start));100 }101 102 73 static void multiboot_modules(uint32_t count, multiboot_module_t *mods) 103 74 { … … 113 84 multiboot_extract_command(init.tasks[init.cnt].name, 114 85 CONFIG_TASK_NAME_BUFLEN, MULTIBOOT_PTR(mods[i].string)); 115 multiboot_extract_argument(init.tasks[init.cnt].arguments, 116 CONFIG_TASK_ARGUMENTS_BUFLEN, MULTIBOOT_PTR(mods[i].string)); 117 } else { 86 } else 118 87 init.tasks[init.cnt].name[0] = 0; 119 init.tasks[init.cnt].arguments[0] = 0;120 }121 88 122 89 init.cnt++; -
kernel/genarch/src/multiboot/multiboot2.c
rdc5aa568 r13c4fe0 49 49 multiboot_extract_command(init.tasks[init.cnt].name, 50 50 CONFIG_TASK_NAME_BUFLEN, module->string); 51 multiboot_extract_argument(init.tasks[init.cnt].arguments,52 CONFIG_TASK_ARGUMENTS_BUFLEN, module->string);53 51 54 52 init.cnt++; -
kernel/generic/include/config.h
rdc5aa568 r13c4fe0 47 47 #define CONFIG_INIT_TASKS 32 48 48 #define CONFIG_TASK_NAME_BUFLEN 32 49 #define CONFIG_TASK_ARGUMENTS_BUFLEN 6450 49 51 50 #ifndef __ASM__ … … 57 56 size_t size; 58 57 char name[CONFIG_TASK_NAME_BUFLEN]; 59 char arguments[CONFIG_TASK_ARGUMENTS_BUFLEN];60 58 } init_task_t; 61 59 -
kernel/generic/src/main/kinit.c
rdc5aa568 r13c4fe0 69 69 #include <str.h> 70 70 #include <sysinfo/stats.h> 71 #include <sysinfo/sysinfo.h>72 71 #include <align.h> 73 72 … … 180 179 program_t programs[CONFIG_INIT_TASKS]; 181 180 182 // FIXME: do not propagate arguments through sysinfo183 // but pass them directly to the tasks184 for (i = 0; i < init.cnt; i++) {185 const char *arguments = init.tasks[i].arguments;186 if (str_length(arguments) == 0)187 continue;188 if (str_length(init.tasks[i].name) == 0)189 continue;190 size_t arguments_size = str_size(arguments);191 192 void *arguments_copy = malloc(arguments_size, 0);193 if (arguments_copy == NULL)194 continue;195 memcpy(arguments_copy, arguments, arguments_size);196 197 char item_name[CONFIG_TASK_NAME_BUFLEN + 15];198 snprintf(item_name, CONFIG_TASK_NAME_BUFLEN + 15,199 "init_args.%s", init.tasks[i].name);200 201 sysinfo_set_item_data(item_name, NULL, arguments_copy, arguments_size);202 }203 204 181 for (i = 0; i < init.cnt; i++) { 205 182 if (init.tasks[i].paddr % FRAME_SIZE) { -
uspace/Makefile
rdc5aa568 r13c4fe0 47 47 app/klog \ 48 48 app/loc \ 49 app/logset \50 49 app/mkfat \ 51 50 app/mkexfat \ … … 75 74 srv/clipboard \ 76 75 srv/locsrv \ 77 srv/logger \78 76 srv/devman \ 79 77 srv/loader \ -
uspace/app/tester/Makefile
rdc5aa568 r13c4fe0 45 45 stdio/stdio1.c \ 46 46 stdio/stdio2.c \ 47 stdio/logger1.c \48 stdio/logger2.c \49 47 fault/fault1.c \ 50 48 fault/fault2.c \ -
uspace/app/tester/tester.c
rdc5aa568 r13c4fe0 39 39 #include <stdio.h> 40 40 #include <str.h> 41 #include <io/log.h>42 41 #include "tester.h" 43 42 … … 56 55 #include "stdio/stdio1.def" 57 56 #include "stdio/stdio2.def" 58 #include "stdio/logger1.def"59 #include "stdio/logger2.def"60 57 #include "fault/fault1.def" 61 58 #include "fault/fault2.def" … … 141 138 } 142 139 143 log_init("tester", LVL_NOTE);144 145 140 test_quiet = false; 146 141 test_argc = argc - 2; -
uspace/app/tester/tester.h
rdc5aa568 r13c4fe0 88 88 extern const char *test_stdio1(void); 89 89 extern const char *test_stdio2(void); 90 extern const char *test_logger1(void);91 extern const char *test_logger2(void);92 90 extern const char *test_fault1(void); 93 91 extern const char *test_fault2(void); -
uspace/lib/c/Makefile
rdc5aa568 r13c4fe0 97 97 generic/io/printf.c \ 98 98 generic/io/log.c \ 99 generic/io/logctl.c \100 99 generic/io/klog.c \ 101 100 generic/io/snprintf.c \ -
uspace/lib/c/generic/io/log.c
rdc5aa568 r13c4fe0 38 38 #include <stdlib.h> 39 39 #include <stdio.h> 40 #include <async.h> 40 41 41 #include <io/log.h> 42 #include <ipc/logger.h>43 #include <ns.h>44 42 45 /** Log messages are printed under this name. */ 43 /** Serialization mutex for logging functions. */ 44 static FIBRIL_MUTEX_INITIALIZE(log_serializer); 45 46 /** Current log level. */ 47 static log_level_t log_level; 48 49 static FILE *log_stream; 50 46 51 static const char *log_prog_name; 47 52 53 /** Prefixes for individual logging levels. */ 48 54 static const char *log_level_names[] = { 49 "fatal", 50 "error", 51 "warn", 52 "note", 53 "debug", 54 "debug2", 55 NULL 55 [LVL_FATAL] = "Fatal error", 56 [LVL_ERROR] = "Error", 57 [LVL_WARN] = "Warning", 58 [LVL_NOTE] = "Note", 59 [LVL_DEBUG] = "Debug", 60 [LVL_DEBUG2] = "Debug2" 56 61 }; 57 58 /** IPC session with the logger service. */59 static async_sess_t *logger_session;60 61 /** Maximum length of a single log message (in bytes). */62 #define MESSAGE_BUFFER_SIZE 409663 64 FIBRIL_RWLOCK_INITIALIZE(current_observed_level_lock);65 log_level_t current_observed_level;66 67 static int logger_register(async_sess_t *session, const char *prog_name)68 {69 async_exch_t *exchange = async_exchange_begin(session);70 if (exchange == NULL) {71 return ENOMEM;72 }73 74 aid_t reg_msg = async_send_0(exchange, LOGGER_REGISTER, NULL);75 int rc = async_data_write_start(exchange, prog_name, str_size(prog_name));76 sysarg_t reg_msg_rc;77 async_wait_for(reg_msg, ®_msg_rc);78 79 async_exchange_end(exchange);80 81 if (rc != EOK) {82 return rc;83 }84 85 return reg_msg_rc;86 }87 88 static int logger_message(async_sess_t *session, log_context_t ctx, log_level_t level, const char *message)89 {90 async_exch_t *exchange = async_exchange_begin(session);91 if (exchange == NULL) {92 return ENOMEM;93 }94 95 aid_t reg_msg = async_send_2(exchange, LOGGER_MESSAGE,96 ctx, level, NULL);97 int rc = async_data_write_start(exchange, message, str_size(message));98 sysarg_t reg_msg_rc;99 async_wait_for(reg_msg, ®_msg_rc);100 101 async_exchange_end(exchange);102 103 /*104 * Getting ENAK means no-one wants our message. That is not an105 * error at all.106 */107 if (rc == ENAK)108 rc = EOK;109 110 if (rc != EOK) {111 return rc;112 }113 114 return reg_msg_rc;115 }116 117 static void cannot_use_level_changed_monitor(void)118 {119 fibril_rwlock_write_lock(¤t_observed_level_lock);120 current_observed_level = LVL_LIMIT;121 fibril_rwlock_write_unlock(¤t_observed_level_lock);122 }123 124 static int observed_level_changed_monitor(void *arg)125 {126 async_sess_t *monitor_session = service_connect_blocking(EXCHANGE_SERIALIZE, SERVICE_LOGGER, LOGGER_INTERFACE_SINK, 0);127 if (monitor_session == NULL) {128 cannot_use_level_changed_monitor();129 return ENOMEM;130 }131 132 int rc = logger_register(monitor_session, log_prog_name);133 if (rc != EOK) {134 cannot_use_level_changed_monitor();135 return rc;136 }137 138 async_exch_t *exchange = async_exchange_begin(monitor_session);139 if (exchange == NULL) {140 cannot_use_level_changed_monitor();141 return ENOMEM;142 }143 144 while (true) {145 sysarg_t has_reader;146 sysarg_t msg_rc = async_req_0_1(exchange,147 LOGGER_BLOCK_UNTIL_READER_CHANGED, &has_reader);148 if (msg_rc != EOK) {149 cannot_use_level_changed_monitor();150 break;151 }152 153 fibril_rwlock_write_lock(¤t_observed_level_lock);154 if ((bool) has_reader) {155 current_observed_level = LVL_LIMIT;156 } else {157 current_observed_level = LVL_NOTE;158 }159 fibril_rwlock_write_unlock(¤t_observed_level_lock);160 }161 162 async_exchange_end(exchange);163 164 return EOK;165 }166 167 static log_level_t get_current_observed_level(void)168 {169 fibril_rwlock_read_lock(¤t_observed_level_lock);170 log_level_t level = current_observed_level;171 fibril_rwlock_read_unlock(¤t_observed_level_lock);172 return level;173 }174 175 const char *log_level_str(log_level_t level)176 {177 if (level >= LVL_LIMIT)178 return "unknown";179 else180 return log_level_names[level];181 }182 183 int log_level_from_str(const char *name, log_level_t *level_out)184 {185 log_level_t level = LVL_FATAL;186 187 while (log_level_names[level] != NULL) {188 if (str_cmp(name, log_level_names[level]) == 0) {189 if (level_out != NULL)190 *level_out = level;191 return EOK;192 }193 level++;194 }195 196 /* Maybe user specified number directly. */197 char *end_ptr;198 int level_int = strtol(name, &end_ptr, 0);199 if ((end_ptr == name) || (str_length(end_ptr) != 0))200 return EINVAL;201 if (level_int < 0)202 return ERANGE;203 if (level_int >= (int) LVL_LIMIT)204 return ERANGE;205 206 if (level_out != NULL)207 *level_out = (log_level_t) level_int;208 209 return EOK;210 }211 62 212 63 /** Initialize the logging system. … … 218 69 { 219 70 assert(level < LVL_LIMIT); 71 log_level = level; 220 72 73 log_stream = stdout; 221 74 log_prog_name = str_dup(prog_name); 222 75 if (log_prog_name == NULL) 223 76 return ENOMEM; 224 77 225 logger_session = service_connect_blocking(EXCHANGE_SERIALIZE, SERVICE_LOGGER, LOGGER_INTERFACE_SINK, 0); 226 if (logger_session == NULL) { 227 return ENOMEM; 228 } 229 230 int rc = logger_register(logger_session, log_prog_name); 231 232 current_observed_level = LVL_NOTE; 233 234 fid_t observed_level_changed_fibril = fibril_create(observed_level_changed_monitor, NULL); 235 if (observed_level_changed_fibril == 0) { 236 cannot_use_level_changed_monitor(); 237 } else { 238 fibril_add_ready(observed_level_changed_fibril); 239 } 240 241 return rc; 242 } 243 244 /** Create logging context. 245 * 246 * This function always returns a valid context. 247 */ 248 log_context_t log_context_create(const char *name) 249 { 250 async_exch_t *exchange = async_exchange_begin(logger_session); 251 if (exchange == NULL) 252 return LOG_CONTEXT_DEFAULT; 253 254 ipc_call_t answer; 255 aid_t reg_msg = async_send_0(exchange, LOGGER_CREATE_CONTEXT, &answer); 256 int rc = async_data_write_start(exchange, name, str_size(name)); 257 sysarg_t reg_msg_rc; 258 async_wait_for(reg_msg, ®_msg_rc); 259 260 async_exchange_end(exchange); 261 262 if ((rc != EOK) || (reg_msg_rc != EOK)) 263 return LOG_CONTEXT_DEFAULT; 264 265 return IPC_GET_ARG1(answer); 266 } 267 268 bool _log_shall_record(log_context_t context, log_level_t level) 269 { 270 return get_current_observed_level() >= level; 78 return EOK; 271 79 } 272 80 … … 278 86 * @param fmt Format string (no traling newline). 279 87 */ 280 void _log_ctx_msg(log_context_t ctx,log_level_t level, const char *fmt, ...)88 void log_msg(log_level_t level, const char *fmt, ...) 281 89 { 282 90 va_list args; 283 91 284 92 va_start(args, fmt); 285 _log_ctx_msgv(ctx,level, fmt, args);93 log_msgv(level, fmt, args); 286 94 va_end(args); 287 95 } … … 294 102 * @param fmt Format string (no trailing newline) 295 103 */ 296 void _log_ctx_msgv(log_context_t ctx,log_level_t level, const char *fmt, va_list args)104 void log_msgv(log_level_t level, const char *fmt, va_list args) 297 105 { 298 106 assert(level < LVL_LIMIT); 299 107 300 if (get_current_observed_level() < level) { 301 return; 108 /* Higher number means higher verbosity. */ 109 if (level <= log_level) { 110 fibril_mutex_lock(&log_serializer); 111 112 fprintf(log_stream, "%s: %s: ", log_prog_name, 113 log_level_names[level]); 114 vfprintf(log_stream, fmt, args); 115 fputc('\n', log_stream); 116 fflush(log_stream); 117 118 fibril_mutex_unlock(&log_serializer); 302 119 } 303 304 char *message_buffer = malloc(MESSAGE_BUFFER_SIZE);305 if (message_buffer == NULL) {306 return;307 }308 309 vsnprintf(message_buffer, MESSAGE_BUFFER_SIZE, fmt, args);310 logger_message(logger_session, ctx, level, message_buffer);311 120 } 312 121 -
uspace/lib/c/include/io/log.h
rdc5aa568 r13c4fe0 36 36 37 37 #include <stdarg.h> 38 #include <inttypes.h>39 #include <bool.h>40 38 41 39 typedef enum { … … 51 49 } log_level_t; 52 50 53 typedef sysarg_t log_context_t;54 #define PRIlogctx PRIxn55 #define LOG_CONTEXT_DEFAULT 056 57 extern const char *log_level_str(log_level_t);58 extern int log_level_from_str(const char *, log_level_t *);59 60 extern bool _log_shall_record(log_context_t, log_level_t);61 51 extern int log_init(const char *, log_level_t); 62 63 extern log_context_t log_context_create(const char *); 64 65 #define log_ctx_msg(context, level, format, ...) \ 66 do { \ 67 if (_log_shall_record((context), (level))) { \ 68 _log_ctx_msg((context), (level), format, ##__VA_ARGS__); \ 69 } \ 70 } while (false) 71 72 #define log_ctx_msgv(context, level, format, args) \ 73 do { \ 74 if (_log_shall_record((context), (level))) { \ 75 _log_ctx_msgv((context), (level), format, args); \ 76 } \ 77 } while (false) 78 79 #define log_msg(level, format, ...) \ 80 log_ctx_msg(LOG_CONTEXT_DEFAULT, (level), (format), ##__VA_ARGS__) 81 #define log_msgv(level, format, args) \ 82 log_ctx_msgv(LOG_CONTEXT_DEFAULT, (level), (format), (args)) 83 84 extern void _log_ctx_msg(log_context_t, log_level_t, const char *, ...); 85 extern void _log_ctx_msgv(log_context_t, log_level_t, const char *, va_list); 52 extern void log_msg(log_level_t, const char *, ...); 53 extern void log_msgv(log_level_t, const char *, va_list); 86 54 87 55 #endif -
uspace/lib/c/include/ipc/services.h
rdc5aa568 r13c4fe0 45 45 SERVICE_VFS = FOURCC('v', 'f', 's', ' '), 46 46 SERVICE_LOC = FOURCC('l', 'o', 'c', ' '), 47 SERVICE_LOGGER = FOURCC('l', 'o', 'g', 'g'),48 47 SERVICE_DEVMAN = FOURCC('d', 'e', 'v', 'n'), 49 48 SERVICE_IRC = FOURCC('i', 'r', 'c', ' '), -
uspace/lib/usb/src/debug.c
rdc5aa568 r13c4fe0 74 74 } 75 75 } 76 log_init(message_prefix, LVL_DEBUG);77 76 } 78 77 … … 149 148 } 150 149 151 va_start(args, format);152 log_msgv(level, format, args);153 va_end(args);154 155 150 fibril_mutex_unlock(&log_serializer); 156 151 }
Note:
See TracChangeset
for help on using the changeset viewer.