+ kernel_event->instrumentation = LTTNG_KERNEL_KPROBE;
+ kernel_event->u.kprobe.addr = address;
+ kernel_event->u.kprobe.offset = offset;
+ if (symbol_name) {
+ strncpy_ret = lttng_strncpy(
+ kernel_event->u.kprobe.symbol_name,
+ symbol_name, LTTNG_KERNEL_SYM_NAME_LEN);
+
+ if (strncpy_ret) {
+ ret_code = LTTNG_ERR_INVALID;
+ goto error;
+ }
+ }
+
+ kernel_event->u.kprobe.symbol_name[LTTNG_KERNEL_SYM_NAME_LEN - 1] = '\0';
+
+ status = lttng_event_rule_kernel_probe_get_event_name(rule, &name);
+ assert(status == LTTNG_EVENT_RULE_STATUS_OK);
+ ret_code = LTTNG_OK;
+ break;
+ }
+ case LTTNG_EVENT_RULE_TYPE_KERNEL_FUNCTION:
+ {
+ uint64_t address = 0, offset = 0;
+ const char *symbol_name = NULL;
+ const struct lttng_kernel_function_location *location = NULL;
+ enum lttng_kernel_function_location_status k_status;
+ enum lttng_event_rule_status status;
+
+ status = lttng_event_rule_kernel_function_get_location(rule, &location);
+ if (status != LTTNG_EVENT_RULE_STATUS_OK) {
+ ret_code = LTTNG_ERR_PROBE_LOCATION_INVAL;
+ goto error;
+ }
+
+ switch (lttng_kernel_function_location_get_type(location)) {
+ case LTTNG_KERNEL_FUNCTION_LOCATION_TYPE_ADDRESS:
+ {
+ k_status = lttng_kernel_function_location_address_get_address(
+ location, &address);
+ assert(k_status == LTTNG_KERNEL_FUNCTION_LOCATION_STATUS_OK);
+ break;
+ }
+ case LTTNG_KERNEL_FUNCTION_LOCATION_TYPE_SYMBOL_OFFSET:
+ {
+ k_status = lttng_kernel_function_location_symbol_get_offset(
+ location, &offset);
+ assert(k_status == LTTNG_KERNEL_FUNCTION_LOCATION_STATUS_OK);
+ symbol_name = lttng_kernel_function_location_symbol_get_name(
+ location);
+ break;
+ }
+ default:
+ abort();
+ }
+
+ kernel_event->instrumentation = LTTNG_KERNEL_KRETPROBE;
+ kernel_event->u.kretprobe.addr = address;
+ kernel_event->u.kretprobe.offset = offset;