1#include "int_route/int_model.h" 2 3#include <stdlib.h> 4#include <string.h> 5#include <stdio.h> 6#include <inttypes.h> 7#include <assert.h> 8 9#define UINT64_T_HEX_LENGTH 18 10#define SEP_LENGTH 1 11#define PARAM_NAME "int_model=" 12 13errval_t int_startup_argument_init(struct int_startup_argument * arg) { 14 memset(arg, 0, sizeof(struct int_startup_argument)); 15 return SYS_ERR_OK; 16} 17 18/* 19 * Turn an int_startup_argument into a string 20 * out must be free'd by the caller. 21 */ 22errval_t int_startup_argument_to_string(struct int_startup_argument * arg, char ** out) { 23 int out_len = strlen(PARAM_NAME) + 3*UINT64_T_HEX_LENGTH + 2*SEP_LENGTH + 1; 24 if(strlen(arg->msix_ctrl_name) > 0){ 25 out_len += strlen(SEP_LENGTH + arg->msix_ctrl_name); 26 } 27 *out = malloc(out_len); 28 assert(*out); 29 snprintf(*out, out_len, PARAM_NAME "%d:%"PRIx64":%"PRIx64, 30 (int)arg->model, 31 arg->int_range_start, arg->int_range_end); 32 33 // append msix ctlr name 34 if(strlen(arg->msix_ctrl_name)){ 35 strcat(*out, ":"); 36 strcat(*out, arg->msix_ctrl_name); 37 } 38 return SYS_ERR_OK; 39} 40 41/* Parse a argv string into a int_startup_argument */ 42errval_t int_startup_argument_parse(char * in, struct int_startup_argument * out) { 43 if(strncmp(in, PARAM_NAME, strlen(PARAM_NAME)) == 0) { 44 int name_start = -1; 45 int m = sscanf(in, PARAM_NAME "%d:%"SCNx64":%"SCNx64":%n", 46 (int*)&(out->model), 47 &(out->int_range_start), 48 &(out->int_range_end), 49 &name_start); 50 if(name_start > -1){ 51 strcpy(out->msix_ctrl_name, in + name_start); 52 } 53 54 if(m == 3) return SYS_ERR_OK; 55 } 56 return SYS_ERR_IRQ_NO_ARG; 57} 58