| # Copyright 2025 The Pigweed Authors |
| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); you may not |
| # use this file except in compliance with the License. You may obtain a copy of |
| # the License at |
| # |
| # https://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT |
| # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the |
| # License for the specific language governing permissions and limitations under |
| # the License. |
| load("@bazel_skylib//lib:selects.bzl", "selects") |
| load("@bazel_skylib//rules:common_settings.bzl", "bool_flag") |
| load("@rules_rust//rust:defs.bzl", "rust_library", "rust_proc_macro") |
| load("//pw_kernel/arch/arm_cortex_m:defs.bzl", "SUPPORTED_CORTEX_M_CPUS") |
| |
| package(default_visibility = ["//visibility:public"]) |
| |
| # The `userspace_support_setting` constraint allows disabling userspace at the |
| # platform level for platforms which don't support userspace, such as in case |
| # of not having an MPU. If `no_userspace_support` is set in the platform, a |
| # `system_image` can never set the userspace attribute to true. |
| # The `userspace_build` flag is used internally by transitions to feature gate |
| # userspace support in the kernel and applications build. |
| constraint_setting( |
| name = "userspace_support_setting", |
| ) |
| |
| constraint_value( |
| name = "userspace_support", |
| constraint_setting = ":userspace_support_setting", |
| ) |
| |
| constraint_value( |
| name = "no_userspace_support", |
| constraint_setting = ":userspace_support_setting", |
| ) |
| |
| bool_flag( |
| name = "userspace_build", |
| build_setting_default = True, |
| tags = ["kernel"], |
| ) |
| |
| config_setting( |
| name = "userspace_build_flag_enabled", |
| flag_values = {":userspace_build": "True"}, |
| ) |
| |
| config_setting( |
| name = "is_os_none", |
| constraint_values = ["@platforms//os:none"], |
| ) |
| |
| selects.config_setting_group( |
| name = "userspace_build_enabled", |
| match_all = [ |
| ":userspace_build_flag_enabled", |
| # Don't enable userspace on host builds. |
| ":is_os_none", |
| ], |
| ) |
| |
| # When building a system with userspace enabled, both the kernel and the |
| # applications have the `userspace_build` flag set to true. However, the |
| # logging backend needs to be different for the kernel and application builds. |
| # |
| # This flag distinguishes the application build from the kernel build to allow |
| # selecting the correct logging backend. |
| bool_flag( |
| name = "is_app_build", |
| build_setting_default = False, |
| ) |
| |
| config_setting( |
| name = "is_app_build_enabled", |
| flag_values = {":is_app_build": "True"}, |
| ) |
| |
| rust_library( |
| name = "userspace", |
| srcs = [ |
| "buffer.rs", |
| "lib.rs", |
| "syscall.rs", |
| "time.rs", |
| ], |
| crate_features = ["user_space"] + selects.with_or({ |
| SUPPORTED_CORTEX_M_CPUS: ["arch_arm_cortex_m"], |
| "@platforms//cpu:riscv32": ["arch_riscv"], |
| "//conditions:default": [], |
| }), |
| edition = "2024", |
| proc_macro_deps = [ |
| ":userspace_macro", |
| ], |
| tags = ["kernel"], |
| target_compatible_with = select({ |
| ":userspace_build_enabled": [], |
| "//conditions:default": ["@platforms//:incompatible"], |
| }), |
| deps = [ |
| "//pw_kernel/config:kernel_config", |
| "//pw_kernel/lib/pw_cast", |
| "//pw_kernel/syscall:syscall_defs", |
| "//pw_kernel/syscall:syscall_user", |
| "//pw_log/rust:pw_log", |
| "//pw_status/rust:pw_status", |
| "//pw_time/rust:pw_time_core", |
| ], |
| ) |
| |
| rust_library( |
| name = "pw_time_backend", |
| srcs = [ |
| "pw_time_backend.rs", |
| ], |
| crate_name = "pw_time_backend", |
| edition = "2024", |
| tags = ["kernel"], |
| target_compatible_with = select({ |
| ":userspace_build_enabled": [], |
| "//conditions:default": ["@platforms//:incompatible"], |
| }), |
| deps = [ |
| ":userspace", |
| ], |
| ) |
| |
| rust_proc_macro( |
| name = "userspace_macro", |
| srcs = [ |
| "userspace_macro.rs", |
| ], |
| compile_data = [ |
| "arm_cortex_m/entry.s", |
| "riscv/entry.s", |
| ], |
| edition = "2024", |
| tags = ["kernel"], |
| deps = [ |
| "@rust_crates//:proc-macro2", |
| "@rust_crates//:quote", |
| "@rust_crates//:syn", |
| ], |
| ) |