Skip to main content

starnix_uapi/
personality.rs

1// Copyright 2023 The Fuchsia Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5use crate::uapi;
6use bitflags::bitflags;
7
8bitflags! {
9    #[derive(Clone, Copy, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
10    pub struct PersonalityFlags: u32 {
11        const UNAME26 = uapi::UNAME26;
12        const ADDR_NO_RANDOMIZE = uapi::ADDR_NO_RANDOMIZE;
13        const FDPIC_FUNCPTRS = uapi::FDPIC_FUNCPTRS;
14        const MMAP_PAGE_ZERO = uapi::MMAP_PAGE_ZERO;
15        const ADDR_COMPAT_LAYOUT = uapi::ADDR_COMPAT_LAYOUT;
16        const READ_IMPLIES_EXEC = uapi::READ_IMPLIES_EXEC;
17        const ADDR_LIMIT_32BIT = uapi::ADDR_LIMIT_32BIT;
18        const SHORT_INODE = uapi::SHORT_INODE;
19        const WHOLE_SECONDS = uapi::WHOLE_SECONDS;
20        const STICKY_TIMEOUTS = uapi::STICKY_TIMEOUTS;
21        const ADDR_LIMIT_3GB = uapi::ADDR_LIMIT_3GB;
22    }
23}
24
25impl PersonalityFlags {
26    /// Returns the execution domain (persona) part of the personality flags.
27    pub fn execution_domain(&self) -> u32 {
28        self.bits() & (uapi::PER_MASK as u32)
29    }
30
31    /// Updates the personality flags from a syscall argument.
32    /// If `value` is `0xffffffff`, it does not update the flags.
33    /// Returns the previous value of the flags as a u32.
34    pub fn update_from_syscall(&mut self, value: u32) -> u32 {
35        let prev = self.bits();
36        if value != 0xffffffff {
37            // Use `from_bits_retain()` since we want to keep unknown flags.
38            *self = PersonalityFlags::from_bits_retain(value);
39        }
40        prev
41    }
42}