L4Re Operating System Framework
Interface and Usage Documentation
Loading...
Searching...
No Matches
__l4_fpage.h
1
6/*
7 * (c) 2008-2009 Adam Lackorzynski <adam@os.inf.tu-dresden.de>,
8 * Alexander Warg <warg@os.inf.tu-dresden.de>,
9 * Björn Döbel <doebel@os.inf.tu-dresden.de>,
10 * Torsten Frenzel <frenzel@os.inf.tu-dresden.de>
11 * economic rights: Technische Universität Dresden (Germany)
12 *
13 * License: see LICENSE.spdx (in this directory or the directories above)
14 */
15#pragma once
16
17#include <l4/sys/compiler.h>
18
43
71
80
84enum
85{
93};
94
103
104
127
226
239
252
264
266#define L4_FPAGE_C_REF_CNT 0x00
267
269#define L4_FPAGE_C_NO_REF_CNT 0x10
270
272#define L4_FPAGE_C_OBJ_RIGHT1 0x20
273
275#define L4_FPAGE_C_OBJ_RIGHT2 0x40
276
278#define L4_FPAGE_C_OBJ_RIGHT3 0x80
279
281#define L4_FPAGE_C_OBJ_RIGHTS 0xe0
282
288#define L4_FPAGE_C_IPCGATE_SVR L4_FPAGE_C_OBJ_RIGHT1
289
291
292
321
322
326enum
327{
332
335};
336
337
338
354l4_fpage(l4_addr_t address, unsigned int order, unsigned char rights) L4_NOTHROW;
355
369
378
379
391l4_iofpage(unsigned long port, unsigned int order) L4_NOTHROW;
392
393
407l4_obj_fpage(l4_cap_idx_t obj, unsigned int order, unsigned char rights) L4_NOTHROW;
408
420
421
452
469l4_map_control(l4_umword_t spot, unsigned char cache, unsigned grant) L4_NOTHROW;
470
485l4_map_obj_control(l4_umword_t spot, unsigned grant) L4_NOTHROW;
486
495L4_INLINE L4_CONSTEXPR unsigned
497
506L4_INLINE L4_CONSTEXPR unsigned
508
521L4_INLINE L4_CONSTEXPR unsigned
523
534L4_INLINE L4_CONSTEXPR unsigned
536
547L4_INLINE L4_CONSTEXPR unsigned long
549
565
581
595L4_INLINE L4_CONSTEXPR unsigned long
597
608l4_fpage_set_rights(l4_fpage_t src, unsigned char new_rights) L4_NOTHROW;
609
622l4_fpage_contains(l4_fpage_t fpage, l4_addr_t addr, unsigned order) L4_NOTHROW;
623
640L4_INLINE L4_CONSTEXPR unsigned char
641l4_fpage_max_order(unsigned char order, l4_addr_t addr,
642 l4_addr_t min_addr, l4_addr_t max_addr,
643 l4_addr_t hotspot L4_DEFAULT_PARAM(0));
644
656
657/*************************************************************************
658 * Implementations
659 *************************************************************************/
660
661L4_INLINE L4_CONSTEXPR unsigned
666
667L4_INLINE L4_CONSTEXPR unsigned
669{
670 return (f.raw & L4_FPAGE_TYPE_MASK) >> L4_FPAGE_TYPE_SHIFT;
671}
672
673L4_INLINE L4_CONSTEXPR unsigned
675{
676 return (f.raw & L4_FPAGE_SIZE_MASK) >> L4_FPAGE_SIZE_SHIFT;
677}
678
679L4_INLINE L4_CONSTEXPR unsigned
681{
682 return (f.raw & L4_FPAGE_SIZE_MASK) >> L4_FPAGE_SIZE_SHIFT;
683}
684
685L4_INLINE L4_CONSTEXPR unsigned long
687{
688 return (f.raw & L4_FPAGE_ADDR_MASK) >> L4_FPAGE_ADDR_SHIFT;
689}
690
691L4_INLINE L4_CONSTEXPR unsigned long
693{
694 return (f.raw & L4_FPAGE_ADDR_MASK) >> L4_FPAGE_ADDR_SHIFT;
695}
696
699{
700 return f.raw & L4_FPAGE_ADDR_MASK;
701}
702
705{
706 return f.raw & L4_FPAGE_ADDR_MASK;
707}
708
711__l4_fpage_generic(unsigned long address, unsigned int type,
712 unsigned int order, unsigned char rights) L4_NOTHROW;
713
715__l4_fpage_generic(unsigned long address, unsigned int type,
716 unsigned int order, unsigned char rights) L4_NOTHROW
717{
718 l4_fpage_t t =
719 {
721 | ((type << L4_FPAGE_TYPE_SHIFT) & L4_FPAGE_TYPE_MASK)
722 | ((order << L4_FPAGE_SIZE_SHIFT) & L4_FPAGE_SIZE_MASK)
723 | ((address ) & L4_FPAGE_ADDR_MASK)
724 };
725 return t;
726}
727
729l4_fpage_set_rights(l4_fpage_t src, unsigned char new_rights) L4_NOTHROW
730{
731 l4_fpage_t f =
732 {
733 ((L4_FPAGE_TYPE_MASK | L4_FPAGE_SIZE_MASK | L4_FPAGE_ADDR_MASK) & src.raw)
734 | ((new_rights << L4_FPAGE_RIGHTS_SHIFT) & L4_FPAGE_RIGHTS_MASK)
735 };
736 return f;
737}
738
740l4_fpage(l4_addr_t address, unsigned int order, unsigned char rights) L4_NOTHROW
741{
742 return __l4_fpage_generic(address, L4_FPAGE_MEMORY, order, rights);
743}
744
746l4_iofpage(unsigned long port, unsigned int order) L4_NOTHROW
747{
748 return __l4_fpage_generic(port << L4_FPAGE_ADDR_SHIFT, L4_FPAGE_IO, order, L4_FPAGE_RW);
749}
750
752l4_obj_fpage(l4_cap_idx_t obj, unsigned int order, unsigned char rights) L4_NOTHROW
753{
754 static_assert((unsigned long)L4_CAP_SHIFT >= L4_FPAGE_ADDR_SHIFT,
755 "Capability index does not fit into fpage.");
756 return __l4_fpage_generic(obj, L4_FPAGE_OBJ, order, rights);
757}
758
761{
762 return __l4_fpage_generic(0, L4_FPAGE_SPECIAL, L4_WHOLE_ADDRESS_SPACE, 0);
763}
764
767{
768 return __l4_fpage_generic(0, L4_FPAGE_SPECIAL, 0, 0);
769}
770
771
777
779l4_map_control(l4_umword_t snd_base, unsigned char cache, unsigned grant) L4_NOTHROW
780{
781 return (snd_base & L4_FPAGE_CONTROL_MASK)
782 | ((l4_umword_t)cache << 4) | L4_ITEM_MAP | grant;
783}
784
787{
788 return l4_map_control(snd_base, 0, grant);
789}
790
792l4_fpage_contains(l4_fpage_t fpage, l4_addr_t addr, unsigned log2size) L4_NOTHROW
793{
794 l4_addr_t fa = l4_fpage_memaddr(fpage);
795 return (fa <= addr)
796 && (fa + (1UL << l4_fpage_order(fpage)) >= addr + (1UL << log2size));
797}
798
799L4_INLINE L4_CONSTEXPR unsigned char
800l4_fpage_max_order(unsigned char order, l4_addr_t addr,
801 l4_addr_t min_addr, l4_addr_t max_addr,
802 l4_addr_t hotspot)
803{
804 while (order < 30 /* limit to 1GB flexpages */)
805 {
806 l4_addr_t mask = ~(~0UL << (order + 1));
807 l4_addr_t base = l4_trunc_size(addr, order + 1);
808 if (base < min_addr)
809 return order;
810
811 if (base + (1UL << (order + 1)) - 1 > max_addr - 1)
812 return order;
813
814 if (hotspot == ~0UL || ((addr ^ hotspot) & mask))
815 break;
816
817 ++order;
818 }
819
820 return order;
821}
822
L4 compiler related defines.
unsigned long l4_umword_t
Unsigned machine word.
Definition l4int.h:40
unsigned long l4_addr_t
Address type.
Definition l4int.h:34
#define L4_MWORD_BITS
Size of machine words in bits.
Definition l4int.h:20
unsigned long l4_cap_idx_t
Capability selector type.
Definition types.h:374
#define L4_CAP_SHIFT
Capability index shift; see l4_cap_idx_t.
Definition consts.h:143
L4_CONSTEXPR unsigned l4_fpage_rights(l4_fpage_t f) L4_NOTHROW
Return rights from a flexpage.
Definition __l4_fpage.h:662
L4_CONSTEXPR unsigned l4_fpage_type(l4_fpage_t f) L4_NOTHROW
Return type from a flexpage.
Definition __l4_fpage.h:668
L4_CONSTEXPR l4_fpage_t l4_iofpage(unsigned long port, unsigned int order) L4_NOTHROW
Create an IO-port flexpage.
Definition __l4_fpage.h:746
L4_CONSTEXPR l4_cap_idx_t l4_fpage_obj(l4_fpage_t f) L4_NOTHROW
Return the capability index from the object flexpage.
Definition __l4_fpage.h:704
L4_CONSTEXPR int l4_is_fpage_valid(l4_fpage_t fp) L4_NOTHROW
Test if the flexpage is valid.
Definition __l4_fpage.h:824
L4_CONSTEXPR l4_fpage_t l4_fpage_all(void) L4_NOTHROW
Get a flexpage, describing all address spaces at once.
Definition __l4_fpage.h:760
L4_CONSTEXPR l4_addr_t l4_fpage_memaddr(l4_fpage_t f) L4_NOTHROW
Return the memory address from the memory flexpage.
Definition __l4_fpage.h:698
L4_CONSTEXPR int l4_is_fpage_writable(l4_fpage_t fp) L4_NOTHROW
Test if the flexpage is writable.
Definition __l4_fpage.h:773
L4_CONSTEXPR unsigned l4_fpage_order(l4_fpage_t f) L4_NOTHROW
Return order (log2(size)) from a flexpage.
Definition __l4_fpage.h:680
L4_fpage_rights
Memory and IO port flexpage rights.
Definition __l4_fpage.h:119
L4_fpage_control
Flexpage map control flags.
Definition __l4_fpage.h:244
L4_CONSTEXPR l4_fpage_t l4_fpage(l4_addr_t address, unsigned int order, unsigned char rights) L4_NOTHROW
Create a memory flexpage.
Definition __l4_fpage.h:740
L4_CONSTEXPR unsigned char l4_fpage_max_order(unsigned char order, l4_addr_t addr, l4_addr_t min_addr, l4_addr_t max_addr, l4_addr_t hotspot=0)
Determine maximum flexpage size of a region.
Definition __l4_fpage.h:800
L4_CONSTEXPR unsigned long l4_fpage_page(l4_fpage_t f) L4_NOTHROW
Return the page part from a flexpage.
Definition __l4_fpage.h:686
L4_CONSTEXPR int l4_fpage_contains(l4_fpage_t fpage, l4_addr_t addr, unsigned order) L4_NOTHROW
Test whether a given range is completely within an fpage.
Definition __l4_fpage.h:792
L4_CONSTEXPR l4_fpage_t l4_obj_fpage(l4_cap_idx_t obj, unsigned int order, unsigned char rights) L4_NOTHROW
Create a kernel-object flexpage.
Definition __l4_fpage.h:752
L4_fpage_type
Flexpage type.
Definition __l4_fpage.h:231
L4_CONSTEXPR unsigned l4_fpage_size(l4_fpage_t f) L4_NOTHROW
Return size (log2) from a flexpage.
Definition __l4_fpage.h:674
L4_CONSTEXPR unsigned long l4_fpage_ioport(l4_fpage_t f) L4_NOTHROW
Return the IO port number from the IO flexpage.
Definition __l4_fpage.h:692
L4_cap_fpage_rights
Object flexpage rights.
Definition __l4_fpage.h:149
L4_CONSTEXPR l4_fpage_t l4_fpage_invalid(void) L4_NOTHROW
Get an invalid flexpage.
Definition __l4_fpage.h:766
L4_CONSTEXPR l4_fpage_t l4_fpage_set_rights(l4_fpage_t src, unsigned char new_rights) L4_NOTHROW
Set new right in a flexpage.
Definition __l4_fpage.h:729
L4_fpage_consts
L4 flexpage structure.
Definition __l4_fpage.h:49
@ L4_WHOLE_IOADDRESS_SPACE
Whole I/O address space size.
Definition __l4_fpage.h:331
@ L4_IOPORT_MAX
Maximum I/O port address plus 1.
Definition __l4_fpage.h:334
@ L4_FPAGE_X
Executable flexpage.
Definition __l4_fpage.h:120
@ L4_FPAGE_RWX
Read-write-execute flexpage.
Definition __l4_fpage.h:125
@ L4_FPAGE_RX
Read-execute flexpage.
Definition __l4_fpage.h:124
@ L4_FPAGE_RO
Read-only flexpage.
Definition __l4_fpage.h:122
@ L4_FPAGE_RW
Read-write flexpage.
Definition __l4_fpage.h:123
@ L4_FPAGE_W
Writable flexpage.
Definition __l4_fpage.h:121
@ L4_FPAGE_CONTROL_MASK
Mask for truncating the lower bits of the send base or the index of the control word.
Definition __l4_fpage.h:250
@ L4_FPAGE_CONTROL_OFFSET_SHIFT
Number of bits an index must be shifted or an address must be aligned to in the control word.
Definition __l4_fpage.h:247
@ L4_FPAGE_MEMORY
Flexpage for memory spaces.
Definition __l4_fpage.h:235
@ L4_FPAGE_IO
Flexpage for I/O port spaces.
Definition __l4_fpage.h:236
@ L4_FPAGE_OBJ
Flexpage for object spaces.
Definition __l4_fpage.h:237
@ L4_FPAGE_SPECIAL
Special flexpage, either l4_fpage_invalid() or l4_fpage_all(); only supported by selected interfaces.
Definition __l4_fpage.h:232
@ L4_WHOLE_ADDRESS_SPACE
Whole address space size.
Definition __l4_fpage.h:92
@ L4_CAP_FPAGE_RO
Read right for capability flexpages.
Definition __l4_fpage.h:176
@ L4_CAP_FPAGE_R
Read right for capability flexpages.
Definition __l4_fpage.h:175
@ L4_CAP_FPAGE_RW
Read and interface specific 'W' right for capability flexpages.
Definition __l4_fpage.h:192
@ L4_CAP_FPAGE_W
Interface specific 'W' right for capability flexpages.
Definition __l4_fpage.h:157
@ L4_CAP_FPAGE_RS
Read and interface specific 'S' right for capability flexpages.
Definition __l4_fpage.h:199
@ L4_CAP_FPAGE_RWSD
Full rights for capability flexpages.
Definition __l4_fpage.h:212
@ L4_CAP_FPAGE_RSD
Read, 'S', and delete right for capability flexpages.
Definition __l4_fpage.h:224
@ L4_CAP_FPAGE_RWS
Read, interface specific 'W', and 'S' rights for capability flexpages.
Definition __l4_fpage.h:206
@ L4_CAP_FPAGE_D
Delete right for capability flexpages.
Definition __l4_fpage.h:185
@ L4_CAP_FPAGE_S
Interface specific 'S' right for capability flexpages.
Definition __l4_fpage.h:169
@ L4_CAP_FPAGE_RWD
Read, write, and delete right for capability flexpages.
Definition __l4_fpage.h:218
@ L4_FPAGE_ADDR_SHIFT
Page address shift.
Definition __l4_fpage.h:53
@ L4_FPAGE_TYPE_SHIFT
Flexpage type shift (memory, IO port, obj...).
Definition __l4_fpage.h:51
@ L4_FPAGE_RIGHTS_MASK
Mask to get the flexpage rights.
Definition __l4_fpage.h:61
@ L4_FPAGE_TYPE_BITS
Flexpage type size (memory, IO port, obj...).
Definition __l4_fpage.h:56
@ L4_FPAGE_RIGHTS_BITS
Access permissions size.
Definition __l4_fpage.h:55
@ L4_FPAGE_RIGHTS_ALL
Specify as flexpage rights during grant.
Definition __l4_fpage.h:69
@ L4_FPAGE_ADDR_BITS
Page address size.
Definition __l4_fpage.h:58
@ L4_FPAGE_SIZE_BITS
Flexpage size size (log2-based).
Definition __l4_fpage.h:57
@ L4_FPAGE_RIGHTS_SHIFT
Access permissions shift.
Definition __l4_fpage.h:50
@ L4_FPAGE_SIZE_SHIFT
Flexpage size shift (log2-based).
Definition __l4_fpage.h:52
l4_addr_t l4_trunc_size(l4_addr_t address, unsigned char bits) L4_NOTHROW
Round an address down to the next lower flexpage with size bits.
Definition consts.h:476
L4_CONSTEXPR l4_umword_t l4_map_control(l4_umword_t spot, unsigned char cache, unsigned grant) L4_NOTHROW
Create the first word for a map item that is a send item for the memory space.
Definition __l4_fpage.h:779
l4_fpage_cacheability_opt_t
Cacheability options for memory send items.
Definition __l4_fpage.h:304
L4_CONSTEXPR l4_umword_t l4_map_obj_control(l4_umword_t spot, unsigned grant) L4_NOTHROW
Create the first word for a map item that is a send item for the object space.
Definition __l4_fpage.h:786
@ L4_FPAGE_CACHEABLE
Cacheability option to enable caches for the mapping.
Definition __l4_fpage.h:311
@ L4_FPAGE_CACHE_OPT
Enable the cacheability option in a memory send item.
Definition __l4_fpage.h:307
@ L4_FPAGE_UNCACHEABLE
Cacheability option to disable caching for the mapping.
Definition __l4_fpage.h:319
@ L4_FPAGE_BUFFERABLE
Cacheability option to enable buffered writes for the mapping.
Definition __l4_fpage.h:315
@ L4_ITEM_MAP
Identify a message item as map item.
Definition consts.h:231
#define L4_NOTHROW
Mark a function declaration and definition as never throwing an exception.
Definition compiler.h:167
#define L4_INLINE
L4 Inline function attribute.
Definition compiler.h:51
#define L4_CONSTEXPR
Constexpr function attribute.
Definition compiler.h:200
Send-flexpage types.
Definition __l4_fpage.h:99
l4_fpage_t fpage
Source flexpage descriptor.
Definition __l4_fpage.h:101
l4_umword_t snd_base
Offset in receive window (send base).
Definition __l4_fpage.h:100
L4 flexpage type.
Definition __l4_fpage.h:76
l4_umword_t raw
Raw value.
Definition __l4_fpage.h:78
l4_umword_t fpage
Raw value.
Definition __l4_fpage.h:77