mirror of
https://github.com/genodelabs/genode.git
synced 2025-06-06 01:11:46 +00:00
base-hw: coding style
Improve consistency with the other base repositories, in particular - Indentation of class initializers - Vertical whitespace around control-flow statements - Preferably place control-flow statements (return, break, continue) at beginning of a line - Placing the opening brace of a namespace at the end of line - Placing the opening brace of a class at a new line - Removing superfluous braces around single statements - Two empty lines between methods/functions in implementation files
This commit is contained in:
parent
cbae9bc1c8
commit
493924a35e
@ -17,8 +17,8 @@
|
|||||||
/* Genode includes */
|
/* Genode includes */
|
||||||
#include <drivers/defs/imx53.h>
|
#include <drivers/defs/imx53.h>
|
||||||
|
|
||||||
namespace Trustzone
|
namespace Trustzone {
|
||||||
{
|
|
||||||
enum {
|
enum {
|
||||||
/**
|
/**
|
||||||
* Currently, we limit secure RAM to 256 MB only,
|
* Currently, we limit secure RAM to 256 MB only,
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
#include <base/rpc.h>
|
#include <base/rpc.h>
|
||||||
#include <pd_session/pd_session.h>
|
#include <pd_session/pd_session.h>
|
||||||
|
|
||||||
|
|
||||||
struct Genode::Pd_session::Native_pd : Interface
|
struct Genode::Pd_session::Native_pd : Interface
|
||||||
{
|
{
|
||||||
virtual void upgrade_cap_slab() = 0;
|
virtual void upgrade_cap_slab() = 0;
|
||||||
|
@ -18,8 +18,8 @@
|
|||||||
#include <kernel/types.h>
|
#include <kernel/types.h>
|
||||||
#include <kernel/interface_support.h>
|
#include <kernel/interface_support.h>
|
||||||
|
|
||||||
namespace Kernel
|
namespace Kernel {
|
||||||
{
|
|
||||||
/**
|
/**
|
||||||
* Kernel names of the kernel calls
|
* Kernel names of the kernel calls
|
||||||
*/
|
*/
|
||||||
|
@ -18,8 +18,8 @@
|
|||||||
#include <kernel/types.h>
|
#include <kernel/types.h>
|
||||||
#include <kernel/interface_support.h>
|
#include <kernel/interface_support.h>
|
||||||
|
|
||||||
namespace Kernel
|
namespace Kernel {
|
||||||
{
|
|
||||||
using addr_t = Genode::addr_t;
|
using addr_t = Genode::addr_t;
|
||||||
using size_t = Genode::size_t;
|
using size_t = Genode::size_t;
|
||||||
using capid_t = Genode::uint16_t;
|
using capid_t = Genode::uint16_t;
|
||||||
|
@ -18,14 +18,15 @@
|
|||||||
/* Genode includes */
|
/* Genode includes */
|
||||||
#include <cpu/cpu_state.h>
|
#include <cpu/cpu_state.h>
|
||||||
|
|
||||||
namespace Genode
|
namespace Genode {
|
||||||
{
|
|
||||||
/**
|
/**
|
||||||
* CPU context of a virtual machine
|
* CPU context of a virtual machine
|
||||||
*/
|
*/
|
||||||
struct Vm_state;
|
struct Vm_state;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
struct Genode::Vm_state : Genode::Cpu_state_modes
|
struct Genode::Vm_state : Genode::Cpu_state_modes
|
||||||
{
|
{
|
||||||
Genode::addr_t dfar;
|
Genode::addr_t dfar;
|
||||||
|
@ -17,14 +17,15 @@
|
|||||||
/* Genode includes */
|
/* Genode includes */
|
||||||
#include <cpu/cpu_state.h>
|
#include <cpu/cpu_state.h>
|
||||||
|
|
||||||
namespace Genode
|
namespace Genode {
|
||||||
{
|
|
||||||
/**
|
/**
|
||||||
* CPU context of a virtual machine
|
* CPU context of a virtual machine
|
||||||
*/
|
*/
|
||||||
struct Vm_state;
|
struct Vm_state;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
struct Genode::Vm_state : Genode::Cpu_state_modes
|
struct Genode::Vm_state : Genode::Cpu_state_modes
|
||||||
{
|
{
|
||||||
Genode::uint64_t vttbr { 0 };
|
Genode::uint64_t vttbr { 0 };
|
||||||
@ -61,7 +62,8 @@ struct Genode::Vm_state : Genode::Cpu_state_modes
|
|||||||
/**
|
/**
|
||||||
* Timer related registers
|
* Timer related registers
|
||||||
*/
|
*/
|
||||||
struct Timer {
|
struct Timer
|
||||||
|
{
|
||||||
Genode::uint64_t offset { 0 };
|
Genode::uint64_t offset { 0 };
|
||||||
Genode::uint64_t compare { 0 };
|
Genode::uint64_t compare { 0 };
|
||||||
Genode::uint32_t control { 0 };
|
Genode::uint32_t control { 0 };
|
||||||
|
@ -17,8 +17,7 @@
|
|||||||
/* Genode includes */
|
/* Genode includes */
|
||||||
#include <base/stdint.h>
|
#include <base/stdint.h>
|
||||||
|
|
||||||
namespace Kernel
|
namespace Kernel {
|
||||||
{
|
|
||||||
typedef Genode::uint32_t Call_arg;
|
typedef Genode::uint32_t Call_arg;
|
||||||
typedef Genode::uint32_t Call_ret;
|
typedef Genode::uint32_t Call_ret;
|
||||||
typedef Genode::uint64_t Call_ret_64;
|
typedef Genode::uint64_t Call_ret_64;
|
||||||
|
@ -17,8 +17,8 @@
|
|||||||
/* Genode includes */
|
/* Genode includes */
|
||||||
#include <cpu/cpu_state.h>
|
#include <cpu/cpu_state.h>
|
||||||
|
|
||||||
namespace Genode
|
namespace Genode {
|
||||||
{
|
|
||||||
/**
|
/**
|
||||||
* CPU context of a virtual machine
|
* CPU context of a virtual machine
|
||||||
*/
|
*/
|
||||||
@ -27,6 +27,7 @@ namespace Genode
|
|||||||
using uint128_t = __uint128_t;
|
using uint128_t = __uint128_t;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
struct Genode::Vm_state : Genode::Cpu_state
|
struct Genode::Vm_state : Genode::Cpu_state
|
||||||
{
|
{
|
||||||
Genode::uint64_t pstate { 0 };
|
Genode::uint64_t pstate { 0 };
|
||||||
|
@ -17,8 +17,7 @@
|
|||||||
/* Genode includes */
|
/* Genode includes */
|
||||||
#include <base/stdint.h>
|
#include <base/stdint.h>
|
||||||
|
|
||||||
namespace Kernel
|
namespace Kernel {
|
||||||
{
|
|
||||||
typedef Genode::uint64_t Call_arg;
|
typedef Genode::uint64_t Call_arg;
|
||||||
typedef Genode::uint64_t Call_ret;
|
typedef Genode::uint64_t Call_ret;
|
||||||
typedef Genode::uint64_t Call_ret_64;
|
typedef Genode::uint64_t Call_ret_64;
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
|
|
||||||
namespace Genode { struct Cpu_state; }
|
namespace Genode { struct Cpu_state; }
|
||||||
|
|
||||||
|
|
||||||
struct Genode::Cpu_state
|
struct Genode::Cpu_state
|
||||||
{
|
{
|
||||||
enum Cpu_exception {
|
enum Cpu_exception {
|
||||||
|
@ -17,8 +17,7 @@
|
|||||||
/* Genode includes */
|
/* Genode includes */
|
||||||
#include <base/stdint.h>
|
#include <base/stdint.h>
|
||||||
|
|
||||||
namespace Kernel
|
namespace Kernel {
|
||||||
{
|
|
||||||
typedef Genode::uint64_t Call_arg;
|
typedef Genode::uint64_t Call_arg;
|
||||||
typedef Genode::uint64_t Call_ret;
|
typedef Genode::uint64_t Call_ret;
|
||||||
typedef Genode::uint64_t Call_ret_64;
|
typedef Genode::uint64_t Call_ret_64;
|
||||||
|
@ -17,8 +17,7 @@
|
|||||||
/* Genode includes */
|
/* Genode includes */
|
||||||
#include <base/stdint.h>
|
#include <base/stdint.h>
|
||||||
|
|
||||||
namespace Kernel
|
namespace Kernel {
|
||||||
{
|
|
||||||
typedef Genode::uint64_t Call_arg;
|
typedef Genode::uint64_t Call_arg;
|
||||||
typedef Genode::uint64_t Call_ret;
|
typedef Genode::uint64_t Call_ret;
|
||||||
typedef Genode::uint64_t Call_ret_64;
|
typedef Genode::uint64_t Call_ret_64;
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
#include <spec/arm/cpu.h>
|
#include <spec/arm/cpu.h>
|
||||||
|
|
||||||
namespace Board {
|
namespace Board {
|
||||||
|
|
||||||
using namespace Hw::Imx53_qsb_board;
|
using namespace Hw::Imx53_qsb_board;
|
||||||
|
|
||||||
using Hw::Pic;
|
using Hw::Pic;
|
||||||
|
@ -20,7 +20,8 @@ bool Board::secure_irq(unsigned) { return true; }
|
|||||||
|
|
||||||
|
|
||||||
Bootstrap::Platform::Board::Board()
|
Bootstrap::Platform::Board::Board()
|
||||||
: early_ram_regions(Memory_region { RAM0_BASE, RAM0_SIZE },
|
:
|
||||||
|
early_ram_regions(Memory_region { RAM0_BASE, RAM0_SIZE },
|
||||||
Memory_region { RAM1_BASE, RAM1_SIZE }),
|
Memory_region { RAM1_BASE, RAM1_SIZE }),
|
||||||
core_mmio(Memory_region { UART_1_MMIO_BASE, UART_1_MMIO_SIZE },
|
core_mmio(Memory_region { UART_1_MMIO_BASE, UART_1_MMIO_SIZE },
|
||||||
Memory_region { EPIT_1_MMIO_BASE, EPIT_1_MMIO_SIZE },
|
Memory_region { EPIT_1_MMIO_BASE, EPIT_1_MMIO_SIZE },
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
|
|
||||||
using namespace Board;
|
using namespace Board;
|
||||||
|
|
||||||
|
|
||||||
bool Board::secure_irq(unsigned i)
|
bool Board::secure_irq(unsigned i)
|
||||||
{
|
{
|
||||||
if (i == EPIT_1_IRQ) return true;
|
if (i == EPIT_1_IRQ) return true;
|
||||||
@ -33,7 +34,8 @@ bool Board::secure_irq(unsigned i)
|
|||||||
|
|
||||||
|
|
||||||
Bootstrap::Platform::Board::Board()
|
Bootstrap::Platform::Board::Board()
|
||||||
: early_ram_regions(Memory_region { Trustzone::SECURE_RAM_BASE,
|
:
|
||||||
|
early_ram_regions(Memory_region { Trustzone::SECURE_RAM_BASE,
|
||||||
Trustzone::SECURE_RAM_SIZE }),
|
Trustzone::SECURE_RAM_SIZE }),
|
||||||
core_mmio(Memory_region { UART_1_MMIO_BASE, UART_1_MMIO_SIZE },
|
core_mmio(Memory_region { UART_1_MMIO_BASE, UART_1_MMIO_SIZE },
|
||||||
Memory_region { EPIT_1_MMIO_BASE, EPIT_1_MMIO_SIZE },
|
Memory_region { EPIT_1_MMIO_BASE, EPIT_1_MMIO_SIZE },
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
#include <hw/spec/arm/gicv2.h>
|
#include <hw/spec/arm/gicv2.h>
|
||||||
|
|
||||||
namespace Board {
|
namespace Board {
|
||||||
|
|
||||||
using namespace Hw::Imx6q_sabrelite_board;
|
using namespace Hw::Imx6q_sabrelite_board;
|
||||||
using Pic = Hw::Gicv2;
|
using Pic = Hw::Gicv2;
|
||||||
struct L2_cache;
|
struct L2_cache;
|
||||||
@ -170,6 +171,7 @@ namespace Board {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
struct Board::L2_cache : Hw::Pl310
|
struct Board::L2_cache : Hw::Pl310
|
||||||
{
|
{
|
||||||
L2_cache(Genode::addr_t mmio) : Hw::Pl310(mmio)
|
L2_cache(Genode::addr_t mmio) : Hw::Pl310(mmio)
|
||||||
|
@ -20,6 +20,7 @@
|
|||||||
#include <hw/spec/arm/gicv2.h>
|
#include <hw/spec/arm/gicv2.h>
|
||||||
|
|
||||||
namespace Board {
|
namespace Board {
|
||||||
|
|
||||||
using namespace Hw::Imx7d_sabre_board;
|
using namespace Hw::Imx7d_sabre_board;
|
||||||
using Pic = Hw::Gicv2;
|
using Pic = Hw::Gicv2;
|
||||||
static constexpr bool NON_SECURE = true;
|
static constexpr bool NON_SECURE = true;
|
||||||
|
@ -20,8 +20,10 @@ extern "C" void * _start_setup_stack; /* entrypoint for non-boot CPUs */
|
|||||||
|
|
||||||
using namespace Board;
|
using namespace Board;
|
||||||
|
|
||||||
|
|
||||||
Bootstrap::Platform::Board::Board()
|
Bootstrap::Platform::Board::Board()
|
||||||
: early_ram_regions(Memory_region { RAM_0_BASE, RAM_0_SIZE }),
|
:
|
||||||
|
early_ram_regions(Memory_region { RAM_0_BASE, RAM_0_SIZE }),
|
||||||
core_mmio(Memory_region { IRQ_CONTROLLER_BASE, IRQ_CONTROLLER_SIZE },
|
core_mmio(Memory_region { IRQ_CONTROLLER_BASE, IRQ_CONTROLLER_SIZE },
|
||||||
Memory_region { UART_1_MMIO_BASE, UART_1_MMIO_SIZE })
|
Memory_region { UART_1_MMIO_BASE, UART_1_MMIO_SIZE })
|
||||||
{
|
{
|
||||||
|
@ -20,6 +20,7 @@
|
|||||||
#include <hw/spec/arm/lpae.h>
|
#include <hw/spec/arm/lpae.h>
|
||||||
|
|
||||||
namespace Board {
|
namespace Board {
|
||||||
|
|
||||||
using namespace Hw::Imx8q_evk_board;
|
using namespace Hw::Imx8q_evk_board;
|
||||||
|
|
||||||
struct Cpu : Hw::Arm_64_cpu
|
struct Cpu : Hw::Arm_64_cpu
|
||||||
|
@ -19,7 +19,8 @@
|
|||||||
* some code does not feel happy with addresses being zero
|
* some code does not feel happy with addresses being zero
|
||||||
*/
|
*/
|
||||||
Bootstrap::Platform::Board::Board()
|
Bootstrap::Platform::Board::Board()
|
||||||
: early_ram_regions(Memory_region { ::Board::RAM_BASE, ::Board::RAM_SIZE }),
|
:
|
||||||
|
early_ram_regions(Memory_region { ::Board::RAM_BASE, ::Board::RAM_SIZE }),
|
||||||
late_ram_regions(Memory_region { }),
|
late_ram_regions(Memory_region { }),
|
||||||
core_mmio(Memory_region { ::Board::UART_BASE, ::Board::UART_SIZE },
|
core_mmio(Memory_region { ::Board::UART_BASE, ::Board::UART_SIZE },
|
||||||
Memory_region { ::Board::Cpu_mmio::IRQ_CONTROLLER_DISTR_BASE,
|
Memory_region { ::Board::Cpu_mmio::IRQ_CONTROLLER_DISTR_BASE,
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
#include <hw/spec/arm/gicv2.h>
|
#include <hw/spec/arm/gicv2.h>
|
||||||
|
|
||||||
namespace Board {
|
namespace Board {
|
||||||
|
|
||||||
using namespace Hw::Nit6_solox_board;
|
using namespace Hw::Nit6_solox_board;
|
||||||
using Pic = Hw::Gicv2;
|
using Pic = Hw::Gicv2;
|
||||||
struct L2_cache;
|
struct L2_cache;
|
||||||
@ -231,6 +232,7 @@ namespace Board {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
struct Board::L2_cache : Hw::Pl310
|
struct Board::L2_cache : Hw::Pl310
|
||||||
{
|
{
|
||||||
L2_cache(Genode::addr_t mmio) : Hw::Pl310(mmio)
|
L2_cache(Genode::addr_t mmio) : Hw::Pl310(mmio)
|
||||||
|
@ -22,6 +22,7 @@
|
|||||||
#include <hw/spec/arm/gicv2.h>
|
#include <hw/spec/arm/gicv2.h>
|
||||||
|
|
||||||
namespace Board {
|
namespace Board {
|
||||||
|
|
||||||
using namespace Hw::Pbxa9_board;
|
using namespace Hw::Pbxa9_board;
|
||||||
|
|
||||||
using Pic = Hw::Gicv2;
|
using Pic = Hw::Gicv2;
|
||||||
|
@ -17,14 +17,16 @@
|
|||||||
using namespace Board;
|
using namespace Board;
|
||||||
|
|
||||||
Bootstrap::Platform::Board::Board()
|
Bootstrap::Platform::Board::Board()
|
||||||
: early_ram_regions(Memory_region { RAM_0_BASE, RAM_0_SIZE },
|
:
|
||||||
|
early_ram_regions(Memory_region { RAM_0_BASE, RAM_0_SIZE },
|
||||||
Memory_region { RAM_1_BASE, RAM_1_SIZE }),
|
Memory_region { RAM_1_BASE, RAM_1_SIZE }),
|
||||||
core_mmio(Memory_region { CORTEX_A9_PRIVATE_MEM_BASE,
|
core_mmio(Memory_region { CORTEX_A9_PRIVATE_MEM_BASE,
|
||||||
CORTEX_A9_PRIVATE_MEM_SIZE },
|
CORTEX_A9_PRIVATE_MEM_SIZE },
|
||||||
Memory_region { PL011_0_MMIO_BASE,
|
Memory_region { PL011_0_MMIO_BASE,
|
||||||
PL011_0_MMIO_SIZE },
|
PL011_0_MMIO_SIZE },
|
||||||
Memory_region { PL310_MMIO_BASE,
|
Memory_region { PL310_MMIO_BASE,
|
||||||
PL310_MMIO_SIZE }) { }
|
PL310_MMIO_SIZE })
|
||||||
|
{ }
|
||||||
|
|
||||||
|
|
||||||
bool Board::Cpu::errata(Board::Cpu::Errata) { return false; }
|
bool Board::Cpu::errata(Board::Cpu::Errata) { return false; }
|
||||||
|
@ -21,8 +21,7 @@
|
|||||||
namespace Board { using namespace Hw::Rpi_board; }
|
namespace Board { using namespace Hw::Rpi_board; }
|
||||||
|
|
||||||
|
|
||||||
constexpr unsigned Hw::Page_table::Descriptor_base::_device_tex() {
|
constexpr unsigned Hw::Page_table::Descriptor_base::_device_tex() { return 0; }
|
||||||
return 0; }
|
|
||||||
|
|
||||||
|
|
||||||
constexpr bool Hw::Page_table::Descriptor_base::_smp() { return false; }
|
constexpr bool Hw::Page_table::Descriptor_base::_smp() { return false; }
|
||||||
|
@ -17,12 +17,14 @@
|
|||||||
|
|
||||||
using namespace Rpi;
|
using namespace Rpi;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Leave out the first page (being 0x0) from bootstraps RAM allocator,
|
* Leave out the first page (being 0x0) from bootstraps RAM allocator,
|
||||||
* some code does not feel happy with addresses being zero
|
* some code does not feel happy with addresses being zero
|
||||||
*/
|
*/
|
||||||
Bootstrap::Platform::Board::Board()
|
Bootstrap::Platform::Board::Board()
|
||||||
: early_ram_regions(Memory_region { RAM_0_BASE + 0x1000,
|
:
|
||||||
|
early_ram_regions(Memory_region { RAM_0_BASE + 0x1000,
|
||||||
RAM_0_SIZE - 0x1000 }),
|
RAM_0_SIZE - 0x1000 }),
|
||||||
late_ram_regions(Memory_region { RAM_0_BASE, 0x1000 }),
|
late_ram_regions(Memory_region { RAM_0_BASE, 0x1000 }),
|
||||||
core_mmio(Memory_region { PL011_0_MMIO_BASE,
|
core_mmio(Memory_region { PL011_0_MMIO_BASE,
|
||||||
@ -32,7 +34,8 @@ Bootstrap::Platform::Board::Board()
|
|||||||
Memory_region { IRQ_CONTROLLER_BASE,
|
Memory_region { IRQ_CONTROLLER_BASE,
|
||||||
IRQ_CONTROLLER_SIZE },
|
IRQ_CONTROLLER_SIZE },
|
||||||
Memory_region { USB_DWC_OTG_BASE,
|
Memory_region { USB_DWC_OTG_BASE,
|
||||||
USB_DWC_OTG_SIZE }) {}
|
USB_DWC_OTG_SIZE })
|
||||||
|
{ }
|
||||||
|
|
||||||
|
|
||||||
unsigned Bootstrap::Platform::enable_mmu()
|
unsigned Bootstrap::Platform::enable_mmu()
|
||||||
@ -43,7 +46,8 @@ unsigned Bootstrap::Platform::enable_mmu()
|
|||||||
|
|
||||||
Cpu::Cpsr::init();
|
Cpu::Cpsr::init();
|
||||||
|
|
||||||
struct Ctr : Cpu::Ctr {
|
struct Ctr : Cpu::Ctr
|
||||||
|
{
|
||||||
struct P : Bitfield<23, 1> { }; /* page mapping restriction on */
|
struct P : Bitfield<23, 1> { }; /* page mapping restriction on */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
#include <hw/spec/arm/lpae.h>
|
#include <hw/spec/arm/lpae.h>
|
||||||
|
|
||||||
namespace Board {
|
namespace Board {
|
||||||
|
|
||||||
using namespace Hw::Rpi3_board;
|
using namespace Hw::Rpi3_board;
|
||||||
|
|
||||||
struct Cpu : Hw::Arm_64_cpu
|
struct Cpu : Hw::Arm_64_cpu
|
||||||
|
@ -18,18 +18,21 @@
|
|||||||
* some code does not feel happy with addresses being zero
|
* some code does not feel happy with addresses being zero
|
||||||
*/
|
*/
|
||||||
Bootstrap::Platform::Board::Board()
|
Bootstrap::Platform::Board::Board()
|
||||||
: early_ram_regions(Memory_region { ::Board::RAM_BASE + 0x1000,
|
:
|
||||||
|
early_ram_regions(Memory_region { ::Board::RAM_BASE + 0x1000,
|
||||||
::Board::RAM_SIZE - 0x1000 }),
|
::Board::RAM_SIZE - 0x1000 }),
|
||||||
late_ram_regions(Memory_region { ::Board::RAM_BASE, 0x1000 }),
|
late_ram_regions(Memory_region { ::Board::RAM_BASE, 0x1000 }),
|
||||||
core_mmio(Memory_region { ::Board::UART_BASE, ::Board::UART_SIZE },
|
core_mmio(Memory_region { ::Board::UART_BASE, ::Board::UART_SIZE },
|
||||||
Memory_region { ::Board::LOCAL_IRQ_CONTROLLER_BASE,
|
Memory_region { ::Board::LOCAL_IRQ_CONTROLLER_BASE,
|
||||||
::Board::LOCAL_IRQ_CONTROLLER_SIZE },
|
::Board::LOCAL_IRQ_CONTROLLER_SIZE },
|
||||||
Memory_region { ::Board::IRQ_CONTROLLER_BASE,
|
Memory_region { ::Board::IRQ_CONTROLLER_BASE,
|
||||||
::Board::IRQ_CONTROLLER_SIZE }) {}
|
::Board::IRQ_CONTROLLER_SIZE })
|
||||||
|
{ }
|
||||||
|
|
||||||
|
|
||||||
extern unsigned int _crt0_qemu_start_secondary_cpus;
|
extern unsigned int _crt0_qemu_start_secondary_cpus;
|
||||||
|
|
||||||
|
|
||||||
void Board::Cpu::wake_up_all_cpus(void * ip)
|
void Board::Cpu::wake_up_all_cpus(void * ip)
|
||||||
{
|
{
|
||||||
/* start when in qemu */
|
/* start when in qemu */
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
#include <spec/arm/cpu.h>
|
#include <spec/arm/cpu.h>
|
||||||
|
|
||||||
namespace Board {
|
namespace Board {
|
||||||
|
|
||||||
using namespace Hw::Usb_armory_board;
|
using namespace Hw::Usb_armory_board;
|
||||||
|
|
||||||
using Hw::Pic;
|
using Hw::Pic;
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
|
|
||||||
using namespace Board;
|
using namespace Board;
|
||||||
|
|
||||||
|
|
||||||
bool Board::secure_irq(unsigned i)
|
bool Board::secure_irq(unsigned i)
|
||||||
{
|
{
|
||||||
if (i == EPIT_1_IRQ) return true;
|
if (i == EPIT_1_IRQ) return true;
|
||||||
@ -28,7 +29,8 @@ bool Board::secure_irq(unsigned i)
|
|||||||
|
|
||||||
|
|
||||||
Bootstrap::Platform::Board::Board()
|
Bootstrap::Platform::Board::Board()
|
||||||
: early_ram_regions(Memory_region { Trustzone::SECURE_RAM_BASE,
|
:
|
||||||
|
early_ram_regions(Memory_region { Trustzone::SECURE_RAM_BASE,
|
||||||
Trustzone::SECURE_RAM_SIZE }),
|
Trustzone::SECURE_RAM_SIZE }),
|
||||||
core_mmio(Memory_region { UART_1_MMIO_BASE, UART_1_MMIO_SIZE },
|
core_mmio(Memory_region { UART_1_MMIO_BASE, UART_1_MMIO_SIZE },
|
||||||
Memory_region { EPIT_1_MMIO_BASE, EPIT_1_MMIO_SIZE },
|
Memory_region { EPIT_1_MMIO_BASE, EPIT_1_MMIO_SIZE },
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
#include <spec/arm/cpu.h>
|
#include <spec/arm/cpu.h>
|
||||||
|
|
||||||
namespace Board {
|
namespace Board {
|
||||||
|
|
||||||
using namespace Hw::Virt_qemu_board;
|
using namespace Hw::Virt_qemu_board;
|
||||||
|
|
||||||
using Psci = Hw::Psci<Hw::Psci_smc_functor>;
|
using Psci = Hw::Psci<Hw::Psci_smc_functor>;
|
||||||
|
@ -18,8 +18,10 @@ extern "C" void * _start_setup_stack; /* entrypoint for non-boot CPUs */
|
|||||||
|
|
||||||
using namespace Board;
|
using namespace Board;
|
||||||
|
|
||||||
|
|
||||||
Bootstrap::Platform::Board::Board()
|
Bootstrap::Platform::Board::Board()
|
||||||
: early_ram_regions(Memory_region { RAM_BASE, RAM_SIZE }),
|
:
|
||||||
|
early_ram_regions(Memory_region { RAM_BASE, RAM_SIZE }),
|
||||||
late_ram_regions(Memory_region { }),
|
late_ram_regions(Memory_region { }),
|
||||||
core_mmio(Memory_region { UART_BASE, UART_SIZE },
|
core_mmio(Memory_region { UART_BASE, UART_SIZE },
|
||||||
Memory_region { Cpu_mmio::IRQ_CONTROLLER_DISTR_BASE,
|
Memory_region { Cpu_mmio::IRQ_CONTROLLER_DISTR_BASE,
|
||||||
@ -27,7 +29,8 @@ Bootstrap::Platform::Board::Board()
|
|||||||
Memory_region { Cpu_mmio::IRQ_CONTROLLER_CPU_BASE,
|
Memory_region { Cpu_mmio::IRQ_CONTROLLER_CPU_BASE,
|
||||||
Cpu_mmio::IRQ_CONTROLLER_CPU_SIZE },
|
Cpu_mmio::IRQ_CONTROLLER_CPU_SIZE },
|
||||||
Memory_region { Cpu_mmio::IRQ_CONTROLLER_VT_CTRL_BASE,
|
Memory_region { Cpu_mmio::IRQ_CONTROLLER_VT_CTRL_BASE,
|
||||||
Cpu_mmio::IRQ_CONTROLLER_VT_CTRL_SIZE }) {}
|
Cpu_mmio::IRQ_CONTROLLER_VT_CTRL_SIZE })
|
||||||
|
{ }
|
||||||
|
|
||||||
|
|
||||||
static inline void switch_to_supervisor_mode(unsigned cpu_id)
|
static inline void switch_to_supervisor_mode(unsigned cpu_id)
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
#include <hw/spec/arm_64/psci_call.h>
|
#include <hw/spec/arm_64/psci_call.h>
|
||||||
|
|
||||||
namespace Board {
|
namespace Board {
|
||||||
|
|
||||||
using namespace Hw::Virt_qemu_board;
|
using namespace Hw::Virt_qemu_board;
|
||||||
|
|
||||||
using Psci = Hw::Psci<Hw::Psci_smc_functor>;
|
using Psci = Hw::Psci<Hw::Psci_smc_functor>;
|
||||||
|
@ -13,8 +13,10 @@
|
|||||||
|
|
||||||
#include <platform.h>
|
#include <platform.h>
|
||||||
|
|
||||||
|
|
||||||
Bootstrap::Platform::Board::Board()
|
Bootstrap::Platform::Board::Board()
|
||||||
: early_ram_regions(Memory_region { ::Board::RAM_BASE, ::Board::RAM_SIZE }),
|
:
|
||||||
|
early_ram_regions(Memory_region { ::Board::RAM_BASE, ::Board::RAM_SIZE }),
|
||||||
late_ram_regions(Memory_region { }),
|
late_ram_regions(Memory_region { }),
|
||||||
core_mmio(Memory_region { ::Board::UART_BASE, ::Board::UART_SIZE },
|
core_mmio(Memory_region { ::Board::UART_BASE, ::Board::UART_SIZE },
|
||||||
Memory_region { ::Board::Cpu_mmio::IRQ_CONTROLLER_DISTR_BASE,
|
Memory_region { ::Board::Cpu_mmio::IRQ_CONTROLLER_DISTR_BASE,
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
#include <hw/spec/arm/gicv2.h>
|
#include <hw/spec/arm/gicv2.h>
|
||||||
|
|
||||||
namespace Board {
|
namespace Board {
|
||||||
|
|
||||||
using namespace Hw::Wand_quad_board;
|
using namespace Hw::Wand_quad_board;
|
||||||
|
|
||||||
using Pic = Hw::Gicv2;
|
using Pic = Hw::Gicv2;
|
||||||
@ -206,6 +207,7 @@ namespace Board {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
struct Board::L2_cache : Hw::Pl310
|
struct Board::L2_cache : Hw::Pl310
|
||||||
{
|
{
|
||||||
L2_cache(Genode::addr_t mmio) : Hw::Pl310(mmio)
|
L2_cache(Genode::addr_t mmio) : Hw::Pl310(mmio)
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
#include <hw/spec/arm/gicv2.h>
|
#include <hw/spec/arm/gicv2.h>
|
||||||
|
|
||||||
namespace Board {
|
namespace Board {
|
||||||
|
|
||||||
using namespace Hw::Zynq_qemu_board;
|
using namespace Hw::Zynq_qemu_board;
|
||||||
using Pic = Hw::Gicv2;
|
using Pic = Hw::Gicv2;
|
||||||
static constexpr bool NON_SECURE = false;
|
static constexpr bool NON_SECURE = false;
|
||||||
|
@ -17,8 +17,10 @@
|
|||||||
|
|
||||||
using namespace Board;
|
using namespace Board;
|
||||||
|
|
||||||
|
|
||||||
Bootstrap::Platform::Board::Board()
|
Bootstrap::Platform::Board::Board()
|
||||||
: early_ram_regions(Memory_region { RAM_0_BASE + 0x1000,
|
:
|
||||||
|
early_ram_regions(Memory_region { RAM_0_BASE + 0x1000,
|
||||||
RAM_0_SIZE - 0x1000 }),
|
RAM_0_SIZE - 0x1000 }),
|
||||||
late_ram_regions(Memory_region { RAM_0_BASE, 0x1000 }),
|
late_ram_regions(Memory_region { RAM_0_BASE, 0x1000 }),
|
||||||
core_mmio(Memory_region { CORTEX_A9_PRIVATE_MEM_BASE,
|
core_mmio(Memory_region { CORTEX_A9_PRIVATE_MEM_BASE,
|
||||||
@ -26,13 +28,15 @@ Bootstrap::Platform::Board::Board()
|
|||||||
Memory_region { UART_BASE,
|
Memory_region { UART_BASE,
|
||||||
UART_SIZE },
|
UART_SIZE },
|
||||||
Memory_region { PL310_MMIO_BASE,
|
Memory_region { PL310_MMIO_BASE,
|
||||||
PL310_MMIO_SIZE }) { }
|
PL310_MMIO_SIZE })
|
||||||
|
{ }
|
||||||
|
|
||||||
|
|
||||||
bool Cpu::errata(Board::Cpu::Errata) {
|
bool Cpu::errata(Board::Cpu::Errata) { return false; }
|
||||||
return false; }
|
|
||||||
|
|
||||||
void Cpu::wake_up_all_cpus(void* ip) {
|
|
||||||
|
void Cpu::wake_up_all_cpus(void* ip)
|
||||||
|
{
|
||||||
struct Wakeup_generator : Genode::Mmio
|
struct Wakeup_generator : Genode::Mmio
|
||||||
{
|
{
|
||||||
struct Core1_boot_addr : Register<0x0, 32> { };
|
struct Core1_boot_addr : Register<0x0, 32> { };
|
||||||
|
@ -18,11 +18,14 @@
|
|||||||
#include <base/internal/globals.h>
|
#include <base/internal/globals.h>
|
||||||
#include <base/internal/unmanaged_singleton.h>
|
#include <base/internal/unmanaged_singleton.h>
|
||||||
|
|
||||||
|
|
||||||
Bootstrap::Platform & Bootstrap::platform() {
|
Bootstrap::Platform & Bootstrap::platform() {
|
||||||
return *unmanaged_singleton<Bootstrap::Platform>(); }
|
return *unmanaged_singleton<Bootstrap::Platform>(); }
|
||||||
|
|
||||||
|
|
||||||
extern "C" void init() __attribute__ ((noreturn));
|
extern "C" void init() __attribute__ ((noreturn));
|
||||||
|
|
||||||
|
|
||||||
extern "C" void init()
|
extern "C" void init()
|
||||||
{
|
{
|
||||||
Bootstrap::Platform & p = Bootstrap::platform();
|
Bootstrap::Platform & p = Bootstrap::platform();
|
||||||
|
@ -32,11 +32,13 @@ void Genode::Lock::lock()
|
|||||||
_state = LOCKED;
|
_state = LOCKED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Genode::Mutex::acquire()
|
void Genode::Mutex::acquire()
|
||||||
{
|
{
|
||||||
_lock.lock();
|
_lock.lock();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Genode::Mutex::release()
|
void Genode::Mutex::release()
|
||||||
{
|
{
|
||||||
_lock.unlock();
|
_lock.unlock();
|
||||||
|
@ -55,8 +55,7 @@ struct Buffer
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
Genode::Log &Genode::Log::log() {
|
Genode::Log &Genode::Log::log() { return unmanaged_singleton<Buffer>()->log; }
|
||||||
return unmanaged_singleton<Buffer>()->log; }
|
|
||||||
|
|
||||||
|
|
||||||
void Genode::raw_write_string(char const *str) { log(str); }
|
void Genode::raw_write_string(char const *str) { log(str); }
|
||||||
|
@ -19,8 +19,10 @@
|
|||||||
|
|
||||||
using namespace Bootstrap;
|
using namespace Bootstrap;
|
||||||
|
|
||||||
|
|
||||||
extern unsigned _bss_end;
|
extern unsigned _bss_end;
|
||||||
|
|
||||||
|
|
||||||
/*****************************
|
/*****************************
|
||||||
** Platform::Ram_allocator **
|
** Platform::Ram_allocator **
|
||||||
*****************************/
|
*****************************/
|
||||||
@ -57,7 +59,8 @@ void Platform::Ram_allocator::remove(Memory_region const & region) {
|
|||||||
******************/
|
******************/
|
||||||
|
|
||||||
Platform::Pd::Pd(Platform::Ram_allocator & alloc)
|
Platform::Pd::Pd(Platform::Ram_allocator & alloc)
|
||||||
: table_base(alloc.alloc_aligned(sizeof(Table), Table::ALIGNM_LOG2)),
|
:
|
||||||
|
table_base(alloc.alloc_aligned(sizeof(Table), Table::ALIGNM_LOG2)),
|
||||||
array_base(alloc.alloc_aligned(sizeof(Table_array), Table::ALIGNM_LOG2)),
|
array_base(alloc.alloc_aligned(sizeof(Table_array), Table::ALIGNM_LOG2)),
|
||||||
table(*Genode::construct_at<Table>(table_base)),
|
table(*Genode::construct_at<Table>(table_base)),
|
||||||
array(*Genode::construct_at<Table_array>(array_base))
|
array(*Genode::construct_at<Table_array>(array_base))
|
||||||
@ -156,12 +159,15 @@ void Platform::start_core(unsigned cpu_id)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static constexpr Genode::Boot_modules_header & header() {
|
static constexpr Genode::Boot_modules_header & header()
|
||||||
return *((Genode::Boot_modules_header*) &_boot_modules_headers_begin); }
|
{
|
||||||
|
return *((Genode::Boot_modules_header*) &_boot_modules_headers_begin);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
Platform::Platform()
|
Platform::Platform()
|
||||||
: bootstrap_region((addr_t)&_prog_img_beg,
|
:
|
||||||
|
bootstrap_region((addr_t)&_prog_img_beg,
|
||||||
((addr_t)&_prog_img_end - (addr_t)&_prog_img_beg)),
|
((addr_t)&_prog_img_end - (addr_t)&_prog_img_beg)),
|
||||||
core_elf_addr(header().base),
|
core_elf_addr(header().base),
|
||||||
core_elf(core_elf_addr)
|
core_elf(core_elf_addr)
|
||||||
|
@ -36,6 +36,7 @@ namespace Bootstrap {
|
|||||||
extern Platform & platform();
|
extern Platform & platform();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
class Bootstrap::Platform
|
class Bootstrap::Platform
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
@ -66,8 +67,10 @@ class Bootstrap::Platform
|
|||||||
public:
|
public:
|
||||||
|
|
||||||
Ram_allocator()
|
Ram_allocator()
|
||||||
: Genode::Allocator_avl_base(&_slab, sizeof(Base::Block)),
|
:
|
||||||
_slab(this, (Block *)&_first_slab) {}
|
Genode::Allocator_avl_base(&_slab, sizeof(Base::Block)),
|
||||||
|
_slab(this, (Block *)&_first_slab)
|
||||||
|
{ }
|
||||||
|
|
||||||
void * alloc_aligned(size_t size, unsigned align);
|
void * alloc_aligned(size_t size, unsigned align);
|
||||||
bool alloc(size_t size, void **out_addr) override;
|
bool alloc(size_t size, void **out_addr) override;
|
||||||
|
@ -15,6 +15,7 @@
|
|||||||
|
|
||||||
#include <spec/arm/cpu.h>
|
#include <spec/arm/cpu.h>
|
||||||
|
|
||||||
|
|
||||||
void Board::Cpu::invalidate_data_cache() {
|
void Board::Cpu::invalidate_data_cache() {
|
||||||
asm volatile ("mcr p15, 0, %[rd], c7, c6, 0" :: [rd]"r"(0) : ); }
|
asm volatile ("mcr p15, 0, %[rd], c7, c6, 0" :: [rd]"r"(0) : ); }
|
||||||
|
|
||||||
|
@ -16,11 +16,14 @@
|
|||||||
|
|
||||||
#include <hw/spec/arm/page_table.h>
|
#include <hw/spec/arm/page_table.h>
|
||||||
|
|
||||||
|
|
||||||
constexpr unsigned Hw::Page_table::Descriptor_base::_device_tex() {
|
constexpr unsigned Hw::Page_table::Descriptor_base::_device_tex() {
|
||||||
return 2; }
|
return 2; }
|
||||||
|
|
||||||
|
|
||||||
constexpr bool Hw::Page_table::Descriptor_base::_smp() { return false; }
|
constexpr bool Hw::Page_table::Descriptor_base::_smp() { return false; }
|
||||||
|
|
||||||
|
|
||||||
void Hw::Page_table::_table_changed(unsigned long, unsigned long) { }
|
void Hw::Page_table::_table_changed(unsigned long, unsigned long) { }
|
||||||
|
|
||||||
#endif /* _SRC__BOOTSTRAP__SPEC__ARM__CORTEX_A8_PAGE_TABLE_H_ */
|
#endif /* _SRC__BOOTSTRAP__SPEC__ARM__CORTEX_A8_PAGE_TABLE_H_ */
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
|
|
||||||
namespace Bootstrap { struct Actlr; }
|
namespace Bootstrap { struct Actlr; }
|
||||||
|
|
||||||
|
|
||||||
struct Bootstrap::Actlr : Board::Cpu::Actlr
|
struct Bootstrap::Actlr : Board::Cpu::Actlr
|
||||||
{
|
{
|
||||||
struct Fw : Bitfield<0, 1> { };
|
struct Fw : Bitfield<0, 1> { };
|
||||||
|
@ -16,11 +16,14 @@
|
|||||||
|
|
||||||
#include <hw/spec/arm/page_table.h>
|
#include <hw/spec/arm/page_table.h>
|
||||||
|
|
||||||
|
|
||||||
constexpr unsigned Hw::Page_table::Descriptor_base::_device_tex() {
|
constexpr unsigned Hw::Page_table::Descriptor_base::_device_tex() {
|
||||||
return 2; }
|
return 2; }
|
||||||
|
|
||||||
|
|
||||||
constexpr bool Hw::Page_table::Descriptor_base::_smp() { return true; }
|
constexpr bool Hw::Page_table::Descriptor_base::_smp() { return true; }
|
||||||
|
|
||||||
|
|
||||||
void Hw::Page_table::_table_changed(unsigned long, unsigned long) { }
|
void Hw::Page_table::_table_changed(unsigned long, unsigned long) { }
|
||||||
|
|
||||||
#endif /* _SRC__BOOTSTRAP__SPEC__ARM__CORTEX_A9_PAGE_TABLE_H_ */
|
#endif /* _SRC__BOOTSTRAP__SPEC__ARM__CORTEX_A9_PAGE_TABLE_H_ */
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
|
|
||||||
namespace Board { struct Cpu; }
|
namespace Board { struct Cpu; }
|
||||||
|
|
||||||
|
|
||||||
struct Board::Cpu : Hw::Arm_cpu
|
struct Board::Cpu : Hw::Arm_cpu
|
||||||
{
|
{
|
||||||
struct Sctlr : Hw::Arm_cpu::Sctlr
|
struct Sctlr : Hw::Arm_cpu::Sctlr
|
||||||
|
@ -14,7 +14,8 @@
|
|||||||
#include <board.h>
|
#include <board.h>
|
||||||
|
|
||||||
Hw::Gicv2::Gicv2()
|
Hw::Gicv2::Gicv2()
|
||||||
: _distr(Board::Cpu_mmio::IRQ_CONTROLLER_DISTR_BASE),
|
:
|
||||||
|
_distr(Board::Cpu_mmio::IRQ_CONTROLLER_DISTR_BASE),
|
||||||
_cpui (Board::Cpu_mmio::IRQ_CONTROLLER_CPU_BASE),
|
_cpui (Board::Cpu_mmio::IRQ_CONTROLLER_CPU_BASE),
|
||||||
_last_iar(Cpu_interface::Iar::Irq_id::bits(spurious_id)),
|
_last_iar(Cpu_interface::Iar::Irq_id::bits(spurious_id)),
|
||||||
_max_irq(_distr.max_irq())
|
_max_irq(_distr.max_irq())
|
||||||
|
@ -14,7 +14,8 @@
|
|||||||
#include <platform.h>
|
#include <platform.h>
|
||||||
|
|
||||||
Hw::Pic::Pic()
|
Hw::Pic::Pic()
|
||||||
: _distr(Board::Cpu_mmio::IRQ_CONTROLLER_DISTR_BASE),
|
:
|
||||||
|
_distr(Board::Cpu_mmio::IRQ_CONTROLLER_DISTR_BASE),
|
||||||
_redistr(Board::Cpu_mmio::IRQ_CONTROLLER_REDIST_BASE),
|
_redistr(Board::Cpu_mmio::IRQ_CONTROLLER_REDIST_BASE),
|
||||||
_redistr_sgi(Board::Cpu_mmio::IRQ_CONTROLLER_REDIST_BASE +
|
_redistr_sgi(Board::Cpu_mmio::IRQ_CONTROLLER_REDIST_BASE +
|
||||||
Board::Cpu_mmio::IRQ_CONTROLLER_REDIST_SIZE / 2),
|
Board::Cpu_mmio::IRQ_CONTROLLER_REDIST_SIZE / 2),
|
||||||
|
@ -19,7 +19,8 @@
|
|||||||
using namespace Board;
|
using namespace Board;
|
||||||
|
|
||||||
Bootstrap::Platform::Board::Board()
|
Bootstrap::Platform::Board::Board()
|
||||||
: early_ram_regions(Memory_region { RAM_BASE, RAM_SIZE }),
|
:
|
||||||
|
early_ram_regions(Memory_region { RAM_BASE, RAM_SIZE }),
|
||||||
core_mmio(Memory_region { UART_BASE,
|
core_mmio(Memory_region { UART_BASE,
|
||||||
UART_SIZE },
|
UART_SIZE },
|
||||||
Memory_region { CORTEX_A9_PRIVATE_MEM_BASE,
|
Memory_region { CORTEX_A9_PRIVATE_MEM_BASE,
|
||||||
|
@ -17,8 +17,8 @@
|
|||||||
|
|
||||||
#include <util/mmio.h>
|
#include <util/mmio.h>
|
||||||
|
|
||||||
namespace Bootstrap
|
namespace Bootstrap {
|
||||||
{
|
|
||||||
/**
|
/**
|
||||||
* AHB to IP Bridge
|
* AHB to IP Bridge
|
||||||
*
|
*
|
||||||
@ -28,6 +28,7 @@ namespace Bootstrap
|
|||||||
class Aipstz;
|
class Aipstz;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
class Bootstrap::Aipstz : public Genode::Mmio
|
class Bootstrap::Aipstz : public Genode::Mmio
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
|
|
||||||
namespace Bootstrap { struct Csu; }
|
namespace Bootstrap { struct Csu; }
|
||||||
|
|
||||||
|
|
||||||
struct Bootstrap::Csu : Genode::Mmio
|
struct Bootstrap::Csu : Genode::Mmio
|
||||||
{
|
{
|
||||||
template <Genode::off_t OFF>
|
template <Genode::off_t OFF>
|
||||||
@ -33,6 +34,7 @@ struct Bootstrap::Csu : Genode::Mmio
|
|||||||
struct Slave_b : Register<OFF, 32>::template Bitfield<16, 9> { };
|
struct Slave_b : Register<OFF, 32>::template Bitfield<16, 9> { };
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
struct Master : public Register<0x218, 32>
|
struct Master : public Register<0x218, 32>
|
||||||
{
|
{
|
||||||
enum {
|
enum {
|
||||||
|
@ -13,7 +13,9 @@
|
|||||||
|
|
||||||
#include <board.h>
|
#include <board.h>
|
||||||
|
|
||||||
Hw::Pic::Pic() : Genode::Mmio(Board::IRQ_CONTROLLER_BASE)
|
Hw::Pic::Pic()
|
||||||
|
:
|
||||||
|
Genode::Mmio(Board::IRQ_CONTROLLER_BASE)
|
||||||
{
|
{
|
||||||
for (unsigned i = 0; i < NR_OF_IRQ; i++) {
|
for (unsigned i = 0; i < NR_OF_IRQ; i++) {
|
||||||
write<Intsec::Nonsecure>(!Board::secure_irq(i), i);
|
write<Intsec::Nonsecure>(!Board::secure_irq(i), i);
|
||||||
|
@ -16,8 +16,12 @@
|
|||||||
|
|
||||||
using namespace Board;
|
using namespace Board;
|
||||||
|
|
||||||
|
|
||||||
Bootstrap::Platform::Board::Board()
|
Bootstrap::Platform::Board::Board()
|
||||||
: early_ram_regions(Memory_region { RAM_0_BASE, RAM_0_SIZE } ), core_mmio() {}
|
:
|
||||||
|
early_ram_regions(Memory_region { RAM_0_BASE, RAM_0_SIZE } ),
|
||||||
|
core_mmio()
|
||||||
|
{ }
|
||||||
|
|
||||||
|
|
||||||
unsigned Bootstrap::Platform::enable_mmu()
|
unsigned Bootstrap::Platform::enable_mmu()
|
||||||
|
@ -20,11 +20,13 @@
|
|||||||
|
|
||||||
namespace Genode { class Multiboot_info; }
|
namespace Genode { class Multiboot_info; }
|
||||||
|
|
||||||
|
|
||||||
class Genode::Multiboot_info : Mmio
|
class Genode::Multiboot_info : Mmio
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
|
|
||||||
struct Flags : Register<0x00, 32> {
|
struct Flags : Register<0x00, 32>
|
||||||
|
{
|
||||||
struct Mem_map : Bitfield<6, 1> { };
|
struct Mem_map : Bitfield<6, 1> { };
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -40,7 +42,8 @@ class Genode::Multiboot_info : Mmio
|
|||||||
Multiboot_info(addr_t mbi) : Mmio(mbi) { }
|
Multiboot_info(addr_t mbi) : Mmio(mbi) { }
|
||||||
Multiboot_info(addr_t mbi, bool strip);
|
Multiboot_info(addr_t mbi, bool strip);
|
||||||
|
|
||||||
struct Mmap : Genode::Mmio {
|
struct Mmap : Genode::Mmio
|
||||||
|
{
|
||||||
struct Size : Register <0x00, 32> { };
|
struct Size : Register <0x00, 32> { };
|
||||||
struct Addr : Register <0x04, 64> { };
|
struct Addr : Register <0x04, 64> { };
|
||||||
struct Length : Register <0x0c, 64> { };
|
struct Length : Register <0x0c, 64> { };
|
||||||
@ -52,8 +55,8 @@ class Genode::Multiboot_info : Mmio
|
|||||||
/**
|
/**
|
||||||
* Physical ram regions
|
* Physical ram regions
|
||||||
*/
|
*/
|
||||||
addr_t phys_ram_mmap_base(unsigned i, bool solely_within_4k_base = true) {
|
addr_t phys_ram_mmap_base(unsigned i, bool solely_within_4k_base = true)
|
||||||
|
{
|
||||||
if (!read<Flags::Mem_map>())
|
if (!read<Flags::Mem_map>())
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
@ -25,7 +25,8 @@ class Genode::Multiboot2_info : Mmio
|
|||||||
|
|
||||||
struct Size : Register <0x0, 32> { };
|
struct Size : Register <0x0, 32> { };
|
||||||
|
|
||||||
struct Tag : Genode::Mmio {
|
struct Tag : Genode::Mmio
|
||||||
|
{
|
||||||
enum { LOG2_SIZE = 3 };
|
enum { LOG2_SIZE = 3 };
|
||||||
|
|
||||||
struct Type : Register <0x00, 32>
|
struct Type : Register <0x00, 32>
|
||||||
@ -55,7 +56,8 @@ class Genode::Multiboot2_info : Mmio
|
|||||||
|
|
||||||
enum { MAGIC = 0x36d76289UL };
|
enum { MAGIC = 0x36d76289UL };
|
||||||
|
|
||||||
struct Memory : Genode::Mmio {
|
struct Memory : Genode::Mmio
|
||||||
|
{
|
||||||
enum { SIZE = 3 * 8 };
|
enum { SIZE = 3 * 8 };
|
||||||
|
|
||||||
struct Addr : Register <0x00, 64> { };
|
struct Addr : Register <0x00, 64> { };
|
||||||
|
@ -23,8 +23,10 @@
|
|||||||
|
|
||||||
using namespace Genode;
|
using namespace Genode;
|
||||||
|
|
||||||
|
|
||||||
/* contains Multiboot MAGIC value (either version 1 or 2) */
|
/* contains Multiboot MAGIC value (either version 1 or 2) */
|
||||||
extern "C" Genode::addr_t __initial_ax;
|
extern "C" Genode::addr_t __initial_ax;
|
||||||
|
|
||||||
/* contains physical pointer to multiboot */
|
/* contains physical pointer to multiboot */
|
||||||
extern "C" Genode::addr_t __initial_bx;
|
extern "C" Genode::addr_t __initial_bx;
|
||||||
|
|
||||||
@ -44,6 +46,7 @@ enum { AP_BOOT_CODE_PAGE = 0x1000 };
|
|||||||
extern "C" void * _start;
|
extern "C" void * _start;
|
||||||
extern "C" void * _ap;
|
extern "C" void * _ap;
|
||||||
|
|
||||||
|
|
||||||
static Hw::Acpi_rsdp search_rsdp(addr_t area, addr_t area_size)
|
static Hw::Acpi_rsdp search_rsdp(addr_t area, addr_t area_size)
|
||||||
{
|
{
|
||||||
if (area && area_size && area < area + area_size) {
|
if (area && area_size && area < area + area_size) {
|
||||||
@ -62,7 +65,8 @@ static Hw::Acpi_rsdp search_rsdp(addr_t area, addr_t area_size)
|
|||||||
|
|
||||||
|
|
||||||
Bootstrap::Platform::Board::Board()
|
Bootstrap::Platform::Board::Board()
|
||||||
: core_mmio(Memory_region { 0, 0x1000 },
|
:
|
||||||
|
core_mmio(Memory_region { 0, 0x1000 },
|
||||||
Memory_region { Hw::Cpu_memory_map::lapic_phys_base(), 0x1000 },
|
Memory_region { Hw::Cpu_memory_map::lapic_phys_base(), 0x1000 },
|
||||||
Memory_region { Hw::Cpu_memory_map::MMIO_IOAPIC_BASE,
|
Memory_region { Hw::Cpu_memory_map::MMIO_IOAPIC_BASE,
|
||||||
Hw::Cpu_memory_map::MMIO_IOAPIC_SIZE },
|
Hw::Cpu_memory_map::MMIO_IOAPIC_SIZE },
|
||||||
@ -219,33 +223,40 @@ Bootstrap::Platform::Board::Board()
|
|||||||
addr_t ap_code_size = (addr_t)&_start - (addr_t)&_ap;
|
addr_t ap_code_size = (addr_t)&_start - (addr_t)&_ap;
|
||||||
memcpy((void *)AP_BOOT_CODE_PAGE, &_ap, ap_code_size);
|
memcpy((void *)AP_BOOT_CODE_PAGE, &_ap, ap_code_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
struct Lapic : Mmio
|
struct Lapic : Mmio
|
||||||
{
|
{
|
||||||
struct Svr : Register<0x0f0, 32>
|
struct Svr : Register<0x0f0, 32>
|
||||||
{
|
{
|
||||||
struct APIC_enable : Bitfield<8, 1> { };
|
struct APIC_enable : Bitfield<8, 1> { };
|
||||||
};
|
};
|
||||||
struct Icr_low : Register<0x300, 32> {
|
|
||||||
|
struct Icr_low : Register<0x300, 32>
|
||||||
|
{
|
||||||
struct Vector : Bitfield< 0, 8> { };
|
struct Vector : Bitfield< 0, 8> { };
|
||||||
struct Delivery_mode : Bitfield< 8, 3> {
|
struct Delivery_mode : Bitfield< 8, 3>
|
||||||
|
{
|
||||||
enum Mode { INIT = 5, SIPI = 6 };
|
enum Mode { INIT = 5, SIPI = 6 };
|
||||||
};
|
};
|
||||||
struct Delivery_status : Bitfield<12, 1> { };
|
struct Delivery_status : Bitfield<12, 1> { };
|
||||||
struct Level_assert : Bitfield<14, 1> { };
|
struct Level_assert : Bitfield<14, 1> { };
|
||||||
struct Dest_shorthand : Bitfield<18, 2> {
|
struct Dest_shorthand : Bitfield<18, 2>
|
||||||
|
{
|
||||||
enum { ALL_OTHERS = 3 };
|
enum { ALL_OTHERS = 3 };
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
struct Icr_high : Register<0x310, 32> {
|
|
||||||
|
struct Icr_high : Register<0x310, 32>
|
||||||
|
{
|
||||||
struct Destination : Bitfield<24, 8> { };
|
struct Destination : Bitfield<24, 8> { };
|
||||||
};
|
};
|
||||||
|
|
||||||
Lapic(addr_t const addr) : Mmio(addr) { }
|
Lapic(addr_t const addr) : Mmio(addr) { }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
static inline void ipi_to_all(Lapic &lapic, unsigned const boot_frame,
|
static inline void ipi_to_all(Lapic &lapic, unsigned const boot_frame,
|
||||||
Lapic::Icr_low::Delivery_mode::Mode const mode)
|
Lapic::Icr_low::Delivery_mode::Mode const mode)
|
||||||
{
|
{
|
||||||
@ -268,6 +279,7 @@ static inline void ipi_to_all(Lapic &lapic, unsigned const boot_frame,
|
|||||||
lapic.write<Lapic::Icr_low>(icr_low);
|
lapic.write<Lapic::Icr_low>(icr_low);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
unsigned Bootstrap::Platform::enable_mmu()
|
unsigned Bootstrap::Platform::enable_mmu()
|
||||||
{
|
{
|
||||||
using ::Board::Cpu;
|
using ::Board::Cpu;
|
||||||
@ -325,4 +337,6 @@ addr_t Bios_data_area::_mmio_base_virt() { return 0x1ff000; }
|
|||||||
|
|
||||||
|
|
||||||
Board::Serial::Serial(addr_t, size_t, unsigned baudrate)
|
Board::Serial::Serial(addr_t, size_t, unsigned baudrate)
|
||||||
:X86_uart(Bios_data_area::singleton()->serial_port(), 0, baudrate) {}
|
:
|
||||||
|
X86_uart(Bios_data_area::singleton()->serial_port(), 0, baudrate)
|
||||||
|
{ }
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
#include <spec/arm/virtualization/board.h>
|
#include <spec/arm/virtualization/board.h>
|
||||||
|
|
||||||
namespace Board {
|
namespace Board {
|
||||||
|
|
||||||
using namespace Hw::Imx7d_sabre_board;
|
using namespace Hw::Imx7d_sabre_board;
|
||||||
|
|
||||||
struct Virtual_local_pic {};
|
struct Virtual_local_pic {};
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
#include <spec/arm/virtualization/board.h>
|
#include <spec/arm/virtualization/board.h>
|
||||||
|
|
||||||
namespace Board {
|
namespace Board {
|
||||||
|
|
||||||
using namespace Hw::Imx8q_evk_board;
|
using namespace Hw::Imx8q_evk_board;
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
#include <spec/arm/cortex_a9_private_timer.h>
|
#include <spec/arm/cortex_a9_private_timer.h>
|
||||||
|
|
||||||
namespace Board {
|
namespace Board {
|
||||||
|
|
||||||
using namespace Hw::Nit6_solox_board;
|
using namespace Hw::Nit6_solox_board;
|
||||||
|
|
||||||
using Pic = Hw::Gicv2;
|
using Pic = Hw::Gicv2;
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
#include <spec/arm/cortex_a9_private_timer.h>
|
#include <spec/arm/cortex_a9_private_timer.h>
|
||||||
|
|
||||||
namespace Board {
|
namespace Board {
|
||||||
|
|
||||||
using namespace Hw::Pbxa9_board;
|
using namespace Hw::Pbxa9_board;
|
||||||
|
|
||||||
using Pic = Hw::Gicv2;
|
using Pic = Hw::Gicv2;
|
||||||
|
@ -19,8 +19,6 @@
|
|||||||
#include <spec/arm/bcm2835_pic.h>
|
#include <spec/arm/bcm2835_pic.h>
|
||||||
#include <spec/arm/bcm2835_system_timer.h>
|
#include <spec/arm/bcm2835_system_timer.h>
|
||||||
|
|
||||||
namespace Board {
|
namespace Board { using namespace Hw::Rpi_board; };
|
||||||
using namespace Hw::Rpi_board;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif /* _CORE__SPEC__RPI__BOARD_H_ */
|
#endif /* _CORE__SPEC__RPI__BOARD_H_ */
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
#include <spec/arm/generic_timer.h>
|
#include <spec/arm/generic_timer.h>
|
||||||
|
|
||||||
namespace Board {
|
namespace Board {
|
||||||
|
|
||||||
using namespace Hw::Rpi3_board;
|
using namespace Hw::Rpi3_board;
|
||||||
|
|
||||||
enum { TIMER_IRQ = 1 };
|
enum { TIMER_IRQ = 1 };
|
||||||
|
@ -23,6 +23,7 @@
|
|||||||
namespace Kernel { class Cpu; }
|
namespace Kernel { class Cpu; }
|
||||||
|
|
||||||
namespace Board {
|
namespace Board {
|
||||||
|
|
||||||
using namespace Hw::Virt_qemu_board;
|
using namespace Hw::Virt_qemu_board;
|
||||||
|
|
||||||
struct Virtual_local_pic {};
|
struct Virtual_local_pic {};
|
||||||
|
@ -15,7 +15,6 @@
|
|||||||
#define _SRC__CORE__SPEC__VIRT_QEMU_64_H_
|
#define _SRC__CORE__SPEC__VIRT_QEMU_64_H_
|
||||||
|
|
||||||
#include <hw/spec/arm/virt_qemu_board.h>
|
#include <hw/spec/arm/virt_qemu_board.h>
|
||||||
//#include <hw/spec/arm/gicv3.h>
|
|
||||||
#include <spec/arm/generic_timer.h>
|
#include <spec/arm/generic_timer.h>
|
||||||
#include <spec/arm/virtualization/gicv3.h>
|
#include <spec/arm/virtualization/gicv3.h>
|
||||||
#include <spec/arm_64/cpu/vm_state_virtualization.h>
|
#include <spec/arm_64/cpu/vm_state_virtualization.h>
|
||||||
@ -24,6 +23,7 @@
|
|||||||
#include <kernel/irq.h>
|
#include <kernel/irq.h>
|
||||||
|
|
||||||
namespace Board {
|
namespace Board {
|
||||||
|
|
||||||
using namespace Hw::Virt_qemu_board;
|
using namespace Hw::Virt_qemu_board;
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
@ -42,11 +42,13 @@ namespace Board {
|
|||||||
using Vm_state = Genode::Vm_state;
|
using Vm_state = Genode::Vm_state;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
namespace Kernel {
|
namespace Kernel {
|
||||||
class Cpu;
|
class Cpu;
|
||||||
class Vm;
|
class Vm;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
struct Board::Vcpu_context
|
struct Board::Vcpu_context
|
||||||
{
|
{
|
||||||
struct Vm_irq : Kernel::Irq
|
struct Vm_irq : Kernel::Irq
|
||||||
@ -77,8 +79,7 @@ struct Board::Vcpu_context
|
|||||||
void disable();
|
void disable();
|
||||||
};
|
};
|
||||||
|
|
||||||
Vcpu_context(Kernel::Cpu & cpu)
|
Vcpu_context(Kernel::Cpu & cpu) : pic_irq(cpu), vtimer_irq(cpu) { }
|
||||||
: pic_irq(cpu), vtimer_irq(cpu) {}
|
|
||||||
|
|
||||||
Pic::Virtual_context pic {};
|
Pic::Virtual_context pic {};
|
||||||
Pic_maintainance_irq pic_irq;
|
Pic_maintainance_irq pic_irq;
|
||||||
|
@ -20,6 +20,7 @@
|
|||||||
#include <spec/arm/cortex_a9_private_timer.h>
|
#include <spec/arm/cortex_a9_private_timer.h>
|
||||||
|
|
||||||
namespace Board {
|
namespace Board {
|
||||||
|
|
||||||
using namespace Hw::Wand_quad_board;
|
using namespace Hw::Wand_quad_board;
|
||||||
|
|
||||||
using L2_cache = Hw::Pl310;
|
using L2_cache = Hw::Pl310;
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
#include <spec/arm/cortex_a9_private_timer.h>
|
#include <spec/arm/cortex_a9_private_timer.h>
|
||||||
|
|
||||||
namespace Board {
|
namespace Board {
|
||||||
|
|
||||||
using namespace Hw::Zynq_qemu_board;
|
using namespace Hw::Zynq_qemu_board;
|
||||||
|
|
||||||
using Pic = Hw::Gicv2;
|
using Pic = Hw::Gicv2;
|
||||||
|
@ -23,5 +23,8 @@
|
|||||||
void Genode::Core_log::out(char const c) { Kernel::log(c); }
|
void Genode::Core_log::out(char const c) { Kernel::log(c); }
|
||||||
|
|
||||||
|
|
||||||
void Genode::raw_write_string(char const *str) {
|
void Genode::raw_write_string(char const *str)
|
||||||
while (char c = *str++) Kernel::log(c); }
|
{
|
||||||
|
while (char c = *str++)
|
||||||
|
Kernel::log(c);
|
||||||
|
}
|
||||||
|
@ -23,6 +23,7 @@
|
|||||||
|
|
||||||
using namespace Genode;
|
using namespace Genode;
|
||||||
|
|
||||||
|
|
||||||
Region_map::Local_addr
|
Region_map::Local_addr
|
||||||
Core_region_map::attach(Dataspace_capability ds_cap, size_t size,
|
Core_region_map::attach(Dataspace_capability ds_cap, size_t size,
|
||||||
off_t offset, bool use_local_addr,
|
off_t offset, bool use_local_addr,
|
||||||
|
@ -21,17 +21,18 @@
|
|||||||
/* core includes */
|
/* core includes */
|
||||||
#include <assertion.h>
|
#include <assertion.h>
|
||||||
|
|
||||||
namespace Genode
|
namespace Genode { class Cpu_thread_allocator; }
|
||||||
{
|
|
||||||
/**
|
|
||||||
|
/**
|
||||||
* Thread allocator for cores CPU service
|
* Thread allocator for cores CPU service
|
||||||
*
|
*
|
||||||
* Normally one would use a SLAB for threads because usually they
|
* Normally one would use a SLAB for threads because usually they
|
||||||
* are tiny objects, but in 'base-hw' they contain the whole kernel
|
* are tiny objects, but in 'base-hw' they contain the whole kernel
|
||||||
* object in addition. Thus we use the given allocator directly.
|
* object in addition. Thus we use the given allocator directly.
|
||||||
*/
|
*/
|
||||||
class Cpu_thread_allocator : public Allocator
|
class Genode::Cpu_thread_allocator : public Allocator
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -68,7 +69,6 @@ namespace Genode
|
|||||||
|
|
||||||
bool need_size_for_free() const override {
|
bool need_size_for_free() const override {
|
||||||
return _alloc.need_size_for_free(); }
|
return _alloc.need_size_for_free(); }
|
||||||
};
|
};
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* _CORE__CPU_THREAD_ALLOCATOR_H_ */
|
#endif /* _CORE__CPU_THREAD_ALLOCATOR_H_ */
|
||||||
|
@ -16,4 +16,5 @@
|
|||||||
|
|
||||||
using namespace Genode;
|
using namespace Genode;
|
||||||
|
|
||||||
|
|
||||||
void Genode::upgrade_capability_slab() { ASSERT_NEVER_CALLED; }
|
void Genode::upgrade_capability_slab() { ASSERT_NEVER_CALLED; }
|
||||||
|
@ -63,12 +63,11 @@ Irq_session_component::~Irq_session_component()
|
|||||||
|
|
||||||
Irq_session_component::Irq_session_component(Range_allocator &irq_alloc,
|
Irq_session_component::Irq_session_component(Range_allocator &irq_alloc,
|
||||||
const char * const args)
|
const char * const args)
|
||||||
: _irq_args(args),
|
:
|
||||||
_irq_number(Platform::irq(_irq_args.irq_number())),
|
_irq_args(args), _irq_number(Platform::irq(_irq_args.irq_number())),
|
||||||
_irq_alloc(irq_alloc),
|
_irq_alloc(irq_alloc), _kobj(), _is_msi(false), _address(0), _value(0)
|
||||||
_kobj(), _is_msi(false), _address(0), _value(0)
|
|
||||||
{
|
{
|
||||||
const long mmconf =
|
long const mmconf =
|
||||||
Arg_string::find_arg(args, "device_config_phys").long_value(0);
|
Arg_string::find_arg(args, "device_config_phys").long_value(0);
|
||||||
|
|
||||||
if (mmconf) {
|
if (mmconf) {
|
||||||
|
@ -16,8 +16,8 @@
|
|||||||
|
|
||||||
#include <kernel/interface.h>
|
#include <kernel/interface.h>
|
||||||
|
|
||||||
namespace Kernel
|
namespace Kernel {
|
||||||
{
|
|
||||||
enum {
|
enum {
|
||||||
DEFAULT_STACK_SIZE = 16 * 1024,
|
DEFAULT_STACK_SIZE = 16 * 1024,
|
||||||
DEFAULT_TRANSLATION_TABLE_MAX = 128,
|
DEFAULT_TRANSLATION_TABLE_MAX = 128,
|
||||||
|
@ -22,8 +22,8 @@
|
|||||||
|
|
||||||
namespace Genode { class Native_utcb; }
|
namespace Genode { class Native_utcb; }
|
||||||
|
|
||||||
namespace Kernel
|
namespace Kernel {
|
||||||
{
|
|
||||||
class Pd;
|
class Pd;
|
||||||
class Thread;
|
class Thread;
|
||||||
class Signal_receiver;
|
class Signal_receiver;
|
||||||
|
@ -27,6 +27,7 @@
|
|||||||
|
|
||||||
using namespace Kernel;
|
using namespace Kernel;
|
||||||
|
|
||||||
|
|
||||||
Kernel::Cpu_pool &Kernel::cpu_pool() { return *unmanaged_singleton<Cpu_pool>(); }
|
Kernel::Cpu_pool &Kernel::cpu_pool() { return *unmanaged_singleton<Cpu_pool>(); }
|
||||||
|
|
||||||
|
|
||||||
@ -80,19 +81,24 @@ void Cpu_job::affinity(Cpu &cpu)
|
|||||||
|
|
||||||
void Cpu_job::quota(unsigned const q)
|
void Cpu_job::quota(unsigned const q)
|
||||||
{
|
{
|
||||||
if (_cpu) { _cpu->scheduler().quota(*this, q); }
|
if (_cpu)
|
||||||
else { Cpu_share::quota(q); }
|
_cpu->scheduler().quota(*this, q);
|
||||||
|
else
|
||||||
|
Cpu_share::quota(q);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Cpu_job::Cpu_job(Cpu_priority const p, unsigned const q)
|
Cpu_job::Cpu_job(Cpu_priority const p, unsigned const q)
|
||||||
:
|
:
|
||||||
Cpu_share(p, q), _cpu(0) { }
|
Cpu_share(p, q), _cpu(0)
|
||||||
|
{ }
|
||||||
|
|
||||||
|
|
||||||
Cpu_job::~Cpu_job()
|
Cpu_job::~Cpu_job()
|
||||||
{
|
{
|
||||||
if (!_cpu) { return; }
|
if (!_cpu)
|
||||||
|
return;
|
||||||
|
|
||||||
_cpu->scheduler().remove(*this);
|
_cpu->scheduler().remove(*this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -103,8 +109,10 @@ Cpu_job::~Cpu_job()
|
|||||||
|
|
||||||
extern "C" void idle_thread_main(void);
|
extern "C" void idle_thread_main(void);
|
||||||
|
|
||||||
|
|
||||||
Cpu::Idle_thread::Idle_thread(Cpu &cpu)
|
Cpu::Idle_thread::Idle_thread(Cpu &cpu)
|
||||||
: Thread("idle")
|
:
|
||||||
|
Thread("idle")
|
||||||
{
|
{
|
||||||
regs->ip = (addr_t)&idle_thread_main;
|
regs->ip = (addr_t)&idle_thread_main;
|
||||||
|
|
||||||
@ -115,20 +123,24 @@ Cpu::Idle_thread::Idle_thread(Cpu &cpu)
|
|||||||
|
|
||||||
void Cpu::schedule(Job * const job)
|
void Cpu::schedule(Job * const job)
|
||||||
{
|
{
|
||||||
if (_id == executing_id()) { _scheduler.ready(job->share()); }
|
if (_id == executing_id())
|
||||||
|
_scheduler.ready(job->share());
|
||||||
else {
|
else {
|
||||||
_scheduler.ready_check(job->share());
|
_scheduler.ready_check(job->share());
|
||||||
if (_scheduler.need_to_schedule()) {
|
|
||||||
|
if (_scheduler.need_to_schedule())
|
||||||
trigger_ip_interrupt();
|
trigger_ip_interrupt();
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool Cpu::interrupt(unsigned const irq_id)
|
bool Cpu::interrupt(unsigned const irq_id)
|
||||||
{
|
{
|
||||||
Irq * const irq = object(irq_id);
|
Irq * const irq = object(irq_id);
|
||||||
if (!irq) return false;
|
|
||||||
|
if (!irq)
|
||||||
|
return false;
|
||||||
|
|
||||||
irq->occurred();
|
irq->occurred();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -159,18 +171,21 @@ Genode::uint8_t kernel_stack[NR_OF_CPUS][Cpu::KERNEL_STACK_SIZE]
|
|||||||
__attribute__((aligned(Genode::get_page_size())));
|
__attribute__((aligned(Genode::get_page_size())));
|
||||||
|
|
||||||
|
|
||||||
addr_t Cpu::stack_start() {
|
addr_t Cpu::stack_start()
|
||||||
return (addr_t)&kernel_stack + KERNEL_STACK_SIZE * (_id+1); }
|
{
|
||||||
|
return (addr_t)&kernel_stack + KERNEL_STACK_SIZE * (_id + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
Cpu::Cpu(unsigned const id,
|
Cpu::Cpu(unsigned const id, Inter_processor_work_list & global_work_list)
|
||||||
Inter_processor_work_list & global_work_list)
|
|
||||||
:
|
:
|
||||||
_id(id), _timer(*this),
|
_id(id), _timer(*this),
|
||||||
_scheduler(_idle, _quota(), _fill()), _idle(*this),
|
_scheduler(_idle, _quota(), _fill()), _idle(*this),
|
||||||
_ipi_irq(*this),
|
_ipi_irq(*this),
|
||||||
_global_work_list(global_work_list)
|
_global_work_list(global_work_list)
|
||||||
{ _arch_init(); }
|
{
|
||||||
|
_arch_init();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**************
|
/**************
|
||||||
@ -193,5 +208,9 @@ Cpu & Cpu_pool::cpu(unsigned const id)
|
|||||||
|
|
||||||
|
|
||||||
using Boot_info = Hw::Boot_info<Board::Boot_info>;
|
using Boot_info = Hw::Boot_info<Board::Boot_info>;
|
||||||
|
|
||||||
|
|
||||||
Cpu_pool::Cpu_pool()
|
Cpu_pool::Cpu_pool()
|
||||||
: _count(reinterpret_cast<Boot_info*>(Hw::Mm::boot_info().base)->cpus) { }
|
:
|
||||||
|
_count(reinterpret_cast<Boot_info*>(Hw::Mm::boot_info().base)->cpus)
|
||||||
|
{ }
|
||||||
|
@ -24,8 +24,8 @@
|
|||||||
#include <kernel/inter_processor_work.h>
|
#include <kernel/inter_processor_work.h>
|
||||||
#include <kernel/thread.h>
|
#include <kernel/thread.h>
|
||||||
|
|
||||||
namespace Kernel
|
namespace Kernel {
|
||||||
{
|
|
||||||
/**
|
/**
|
||||||
* Class for kernel data that is needed to manage a specific CPU
|
* Class for kernel data that is needed to manage a specific CPU
|
||||||
*/
|
*/
|
||||||
|
@ -19,8 +19,8 @@
|
|||||||
#include <kernel/cpu_scheduler.h>
|
#include <kernel/cpu_scheduler.h>
|
||||||
#include <kernel/timer.h>
|
#include <kernel/timer.h>
|
||||||
|
|
||||||
namespace Kernel
|
namespace Kernel {
|
||||||
{
|
|
||||||
class Cpu;
|
class Cpu;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -29,6 +29,7 @@ namespace Kernel
|
|||||||
class Cpu_job;
|
class Cpu_job;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
class Kernel::Cpu_job : private Cpu_share
|
class Kernel::Cpu_job : private Cpu_share
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
|
@ -15,6 +15,7 @@
|
|||||||
|
|
||||||
using namespace Kernel;
|
using namespace Kernel;
|
||||||
|
|
||||||
|
|
||||||
void Cpu::Ipi::occurred()
|
void Cpu::Ipi::occurred()
|
||||||
{
|
{
|
||||||
/* lambda to iterate over a work-list and execute all work items */
|
/* lambda to iterate over a work-list and execute all work items */
|
||||||
@ -39,7 +40,8 @@ void Cpu::Ipi::occurred()
|
|||||||
void Cpu::trigger_ip_interrupt()
|
void Cpu::trigger_ip_interrupt()
|
||||||
{
|
{
|
||||||
/* check whether there is still an IPI send */
|
/* check whether there is still an IPI send */
|
||||||
if (_ipi_irq.pending) return;
|
if (_ipi_irq.pending)
|
||||||
|
return;
|
||||||
|
|
||||||
_pic.send_ipi(_id);
|
_pic.send_ipi(_id);
|
||||||
_ipi_irq.pending = true;
|
_ipi_irq.pending = true;
|
||||||
@ -47,5 +49,8 @@ void Cpu::trigger_ip_interrupt()
|
|||||||
|
|
||||||
|
|
||||||
Cpu::Ipi::Ipi(Cpu & cpu)
|
Cpu::Ipi::Ipi(Cpu & cpu)
|
||||||
: Irq(Board::Pic::IPI, cpu), cpu(cpu) {
|
:
|
||||||
cpu.pic().unmask(Board::Pic::IPI, cpu.id()); }
|
Irq(Board::Pic::IPI, cpu), cpu(cpu)
|
||||||
|
{
|
||||||
|
cpu.pic().unmask(Board::Pic::IPI, cpu.id());
|
||||||
|
}
|
||||||
|
@ -40,8 +40,10 @@ void Cpu_scheduler::_next_round()
|
|||||||
|
|
||||||
void Cpu_scheduler::_consumed(unsigned const q)
|
void Cpu_scheduler::_consumed(unsigned const q)
|
||||||
{
|
{
|
||||||
if (_residual > q) { _residual -= q; }
|
if (_residual > q)
|
||||||
else { _next_round(); }
|
_residual -= q;
|
||||||
|
else
|
||||||
|
_next_round();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -62,18 +64,27 @@ void Cpu_scheduler::_next_fill()
|
|||||||
|
|
||||||
void Cpu_scheduler::_head_claimed(unsigned const r)
|
void Cpu_scheduler::_head_claimed(unsigned const r)
|
||||||
{
|
{
|
||||||
if (!_head->_quota) { return; }
|
if (!_head->_quota)
|
||||||
|
return;
|
||||||
|
|
||||||
_head->_claim = r > _head->_quota ? _head->_quota : r;
|
_head->_claim = r > _head->_quota ? _head->_quota : r;
|
||||||
if (_head->_claim || !_head->_ready) { return; }
|
|
||||||
|
if (_head->_claim || !_head->_ready)
|
||||||
|
return;
|
||||||
|
|
||||||
_rcl[_head->_prio].to_tail(&_head->_claim_item);
|
_rcl[_head->_prio].to_tail(&_head->_claim_item);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Cpu_scheduler::_head_filled(unsigned const r)
|
void Cpu_scheduler::_head_filled(unsigned const r)
|
||||||
{
|
{
|
||||||
if (_fills.head() != &_head->_fill_item) { return; }
|
if (_fills.head() != &_head->_fill_item)
|
||||||
if (r) { _head->_fill = r; }
|
return;
|
||||||
else { _next_fill(); }
|
|
||||||
|
if (r)
|
||||||
|
_head->_fill = r;
|
||||||
|
else
|
||||||
|
_next_fill();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -81,9 +92,15 @@ bool Cpu_scheduler::_claim_for_head()
|
|||||||
{
|
{
|
||||||
for (signed p = Prio::MAX; p > Prio::MIN - 1; p--) {
|
for (signed p = Prio::MAX; p > Prio::MIN - 1; p--) {
|
||||||
Double_list_item<Cpu_share> *const item { _rcl[p].head() };
|
Double_list_item<Cpu_share> *const item { _rcl[p].head() };
|
||||||
if (!item) { continue; }
|
|
||||||
|
if (!item)
|
||||||
|
continue;
|
||||||
|
|
||||||
Cpu_share &share { item->payload() };
|
Cpu_share &share { item->payload() };
|
||||||
if (!share._claim) { continue; }
|
|
||||||
|
if (!share._claim)
|
||||||
|
continue;
|
||||||
|
|
||||||
_set_head(share, share._claim, 1);
|
_set_head(share, share._claim, 1);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -94,9 +111,9 @@ bool Cpu_scheduler::_claim_for_head()
|
|||||||
bool Cpu_scheduler::_fill_for_head()
|
bool Cpu_scheduler::_fill_for_head()
|
||||||
{
|
{
|
||||||
Double_list_item<Cpu_share> *const item { _fills.head() };
|
Double_list_item<Cpu_share> *const item { _fills.head() };
|
||||||
if (!item) {
|
if (!item)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
|
||||||
Share &share = item->payload();
|
Share &share = item->payload();
|
||||||
_set_head(share, share._fill, 0);
|
_set_head(share, share._fill, 0);
|
||||||
return 1;
|
return 1;
|
||||||
@ -106,7 +123,9 @@ bool Cpu_scheduler::_fill_for_head()
|
|||||||
unsigned Cpu_scheduler::_trim_consumption(unsigned &q)
|
unsigned Cpu_scheduler::_trim_consumption(unsigned &q)
|
||||||
{
|
{
|
||||||
q = Genode::min(Genode::min(q, _head_quota), _residual);
|
q = Genode::min(Genode::min(q, _head_quota), _residual);
|
||||||
if (!_head_yields) { return _head_quota - q; }
|
if (!_head_yields)
|
||||||
|
return _head_quota - q;
|
||||||
|
|
||||||
_head_yields = false;
|
_head_yields = false;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -114,22 +133,31 @@ unsigned Cpu_scheduler::_trim_consumption(unsigned &q)
|
|||||||
|
|
||||||
void Cpu_scheduler::_quota_introduction(Share &s)
|
void Cpu_scheduler::_quota_introduction(Share &s)
|
||||||
{
|
{
|
||||||
if (s._ready) { _rcl[s._prio].insert_tail(&s._claim_item); }
|
if (s._ready)
|
||||||
else { _ucl[s._prio].insert_tail(&s._claim_item); }
|
_rcl[s._prio].insert_tail(&s._claim_item);
|
||||||
|
else
|
||||||
|
_ucl[s._prio].insert_tail(&s._claim_item);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Cpu_scheduler::_quota_revokation(Share &s)
|
void Cpu_scheduler::_quota_revokation(Share &s)
|
||||||
{
|
{
|
||||||
if (s._ready) { _rcl[s._prio].remove(&s._claim_item); }
|
if (s._ready)
|
||||||
else { _ucl[s._prio].remove(&s._claim_item); }
|
_rcl[s._prio].remove(&s._claim_item);
|
||||||
|
else
|
||||||
|
_ucl[s._prio].remove(&s._claim_item);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Cpu_scheduler::_quota_adaption(Share &s, unsigned const q)
|
void Cpu_scheduler::_quota_adaption(Share &s, unsigned const q)
|
||||||
{
|
{
|
||||||
if (q) { if (s._claim > q) { s._claim = q; } }
|
if (q) {
|
||||||
else { _quota_revokation(s); }
|
if (s._claim > q)
|
||||||
|
s._claim = q;
|
||||||
|
} else {
|
||||||
|
_quota_revokation(s);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -142,13 +170,21 @@ void Cpu_scheduler::update(time_t time)
|
|||||||
/* do not detract the quota if the head context was removed even now */
|
/* do not detract the quota if the head context was removed even now */
|
||||||
if (_head) {
|
if (_head) {
|
||||||
unsigned const r = _trim_consumption(duration);
|
unsigned const r = _trim_consumption(duration);
|
||||||
if (_head_claims) { _head_claimed(r); }
|
|
||||||
else { _head_filled(r); }
|
if (_head_claims)
|
||||||
|
_head_claimed(r);
|
||||||
|
else
|
||||||
|
_head_filled(r);
|
||||||
|
|
||||||
_consumed(duration);
|
_consumed(duration);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_claim_for_head()) { return; }
|
if (_claim_for_head())
|
||||||
if (_fill_for_head()) { return; }
|
return;
|
||||||
|
|
||||||
|
if (_fill_for_head())
|
||||||
|
return;
|
||||||
|
|
||||||
_set_head(_idle, _fill, 0);
|
_set_head(_idle, _fill, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -159,9 +195,9 @@ void Cpu_scheduler::ready_check(Share &s1)
|
|||||||
|
|
||||||
ready(s1);
|
ready(s1);
|
||||||
|
|
||||||
if (_need_to_schedule) {
|
if (_need_to_schedule)
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
Share * s2 = _head;
|
Share * s2 = _head;
|
||||||
if (!s1._claim) {
|
if (!s1._claim) {
|
||||||
_need_to_schedule = s2 == &_idle;
|
_need_to_schedule = s2 == &_idle;
|
||||||
@ -191,10 +227,16 @@ void Cpu_scheduler::ready(Share &s)
|
|||||||
s._ready = 1;
|
s._ready = 1;
|
||||||
s._fill = _fill;
|
s._fill = _fill;
|
||||||
_fills.insert_tail(&s._fill_item);
|
_fills.insert_tail(&s._fill_item);
|
||||||
if (!s._quota) { return; }
|
|
||||||
|
if (!s._quota)
|
||||||
|
return;
|
||||||
|
|
||||||
_ucl[s._prio].remove(&s._claim_item);
|
_ucl[s._prio].remove(&s._claim_item);
|
||||||
if (s._claim) { _rcl[s._prio].insert_head(&s._claim_item); }
|
|
||||||
else { _rcl[s._prio].insert_tail(&s._claim_item); }
|
if (s._claim)
|
||||||
|
_rcl[s._prio].insert_head(&s._claim_item);
|
||||||
|
else
|
||||||
|
_rcl[s._prio].insert_tail(&s._claim_item);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -206,7 +248,10 @@ void Cpu_scheduler::unready(Share &s)
|
|||||||
|
|
||||||
s._ready = 0;
|
s._ready = 0;
|
||||||
_fills.remove(&s._fill_item);
|
_fills.remove(&s._fill_item);
|
||||||
if (!s._quota) { return; }
|
|
||||||
|
if (!s._quota)
|
||||||
|
return;
|
||||||
|
|
||||||
_rcl[s._prio].remove(&s._claim_item);
|
_rcl[s._prio].remove(&s._claim_item);
|
||||||
_ucl[s._prio].insert_tail(&s._claim_item);
|
_ucl[s._prio].insert_tail(&s._claim_item);
|
||||||
}
|
}
|
||||||
@ -224,19 +269,32 @@ void Cpu_scheduler::remove(Share &s)
|
|||||||
assert(&s != &_idle);
|
assert(&s != &_idle);
|
||||||
|
|
||||||
_need_to_schedule = true;
|
_need_to_schedule = true;
|
||||||
if (&s == _head) _head = nullptr;
|
|
||||||
if (s._ready) { _fills.remove(&s._fill_item); }
|
if (&s == _head)
|
||||||
if (!s._quota) { return; }
|
_head = nullptr;
|
||||||
if (s._ready) { _rcl[s._prio].remove(&s._claim_item); }
|
|
||||||
else { _ucl[s._prio].remove(&s._claim_item); }
|
if (s._ready)
|
||||||
|
_fills.remove(&s._fill_item);
|
||||||
|
|
||||||
|
if (!s._quota)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (s._ready)
|
||||||
|
_rcl[s._prio].remove(&s._claim_item);
|
||||||
|
else
|
||||||
|
_ucl[s._prio].remove(&s._claim_item);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Cpu_scheduler::insert(Share &s)
|
void Cpu_scheduler::insert(Share &s)
|
||||||
{
|
{
|
||||||
assert(!s._ready);
|
assert(!s._ready);
|
||||||
|
|
||||||
_need_to_schedule = true;
|
_need_to_schedule = true;
|
||||||
if (!s._quota) { return; }
|
|
||||||
|
if (!s._quota)
|
||||||
|
return;
|
||||||
|
|
||||||
s._claim = s._quota;
|
s._claim = s._quota;
|
||||||
_ucl[s._prio].insert_head(&s._claim_item);
|
_ucl[s._prio].insert_head(&s._claim_item);
|
||||||
}
|
}
|
||||||
@ -245,8 +303,12 @@ void Cpu_scheduler::insert(Share &s)
|
|||||||
void Cpu_scheduler::quota(Share &s, unsigned const q)
|
void Cpu_scheduler::quota(Share &s, unsigned const q)
|
||||||
{
|
{
|
||||||
assert(&s != &_idle);
|
assert(&s != &_idle);
|
||||||
if (s._quota) { _quota_adaption(s, q); }
|
|
||||||
else if (q) { _quota_introduction(s); }
|
if (s._quota)
|
||||||
|
_quota_adaption(s, q);
|
||||||
|
else if (q)
|
||||||
|
_quota_introduction(s);
|
||||||
|
|
||||||
s._quota = q;
|
s._quota = q;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -258,7 +320,9 @@ Cpu_share &Cpu_scheduler::head() const
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Cpu_scheduler::Cpu_scheduler(Share &i, unsigned const q,
|
Cpu_scheduler::Cpu_scheduler(Share &i, unsigned const q, unsigned const f)
|
||||||
unsigned const f)
|
:
|
||||||
: _idle(i), _quota(q), _residual(q), _fill(f)
|
_idle(i), _quota(q), _residual(q), _fill(f)
|
||||||
{ _set_head(i, f, 0); }
|
{
|
||||||
|
_set_head(i, f, 0);
|
||||||
|
}
|
||||||
|
@ -20,8 +20,8 @@
|
|||||||
#include <kernel/configuration.h>
|
#include <kernel/configuration.h>
|
||||||
#include <kernel/double_list.h>
|
#include <kernel/double_list.h>
|
||||||
|
|
||||||
namespace Kernel
|
namespace Kernel {
|
||||||
{
|
|
||||||
/**
|
/**
|
||||||
* Priority of an unconsumed CPU claim versus other unconsumed CPU claims
|
* Priority of an unconsumed CPU claim versus other unconsumed CPU claims
|
||||||
*/
|
*/
|
||||||
@ -38,6 +38,7 @@ namespace Kernel
|
|||||||
class Cpu_scheduler;
|
class Cpu_scheduler;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
class Kernel::Cpu_priority
|
class Kernel::Cpu_priority
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
@ -69,6 +70,7 @@ class Kernel::Cpu_priority
|
|||||||
operator signed() const { return _value; }
|
operator signed() const { return _value; }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
class Kernel::Cpu_share
|
class Kernel::Cpu_share
|
||||||
{
|
{
|
||||||
friend class Cpu_scheduler;
|
friend class Cpu_scheduler;
|
||||||
|
@ -14,8 +14,8 @@
|
|||||||
#ifndef _CORE__KERNEL__DOUBLE_LIST_H_
|
#ifndef _CORE__KERNEL__DOUBLE_LIST_H_
|
||||||
#define _CORE__KERNEL__DOUBLE_LIST_H_
|
#define _CORE__KERNEL__DOUBLE_LIST_H_
|
||||||
|
|
||||||
namespace Kernel
|
namespace Kernel {
|
||||||
{
|
|
||||||
/**
|
/**
|
||||||
* Ability to be an item in a double connected list
|
* Ability to be an item in a double connected list
|
||||||
*/
|
*/
|
||||||
@ -29,6 +29,7 @@ namespace Kernel
|
|||||||
class Double_list;
|
class Double_list;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
class Kernel::Double_list_item
|
class Kernel::Double_list_item
|
||||||
{
|
{
|
||||||
@ -47,6 +48,7 @@ class Kernel::Double_list_item
|
|||||||
T &payload() { return _payload; }
|
T &payload() { return _payload; }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
class Kernel::Double_list
|
class Kernel::Double_list
|
||||||
{
|
{
|
||||||
@ -129,7 +131,9 @@ class Kernel::Double_list
|
|||||||
*/
|
*/
|
||||||
void head_to_tail()
|
void head_to_tail()
|
||||||
{
|
{
|
||||||
if (!_head || _head == _tail) { return; }
|
if (!_head || _head == _tail)
|
||||||
|
return;
|
||||||
|
|
||||||
_head->_prev = _tail;
|
_head->_prev = _tail;
|
||||||
_tail->_next = _head;
|
_tail->_next = _head;
|
||||||
_head = _head->_next;
|
_head = _head->_next;
|
||||||
|
@ -26,9 +26,11 @@
|
|||||||
|
|
||||||
using namespace Kernel;
|
using namespace Kernel;
|
||||||
|
|
||||||
|
|
||||||
static_assert(sizeof(Genode::sizet_arithm_t) >= 2 * sizeof(size_t),
|
static_assert(sizeof(Genode::sizet_arithm_t) >= 2 * sizeof(size_t),
|
||||||
"Bad result type for size_t arithmetics.");
|
"Bad result type for size_t arithmetics.");
|
||||||
|
|
||||||
|
|
||||||
Pd &Kernel::core_pd() {
|
Pd &Kernel::core_pd() {
|
||||||
return unmanaged_singleton<Genode::Core_platform_pd>()->kernel_pd(); }
|
return unmanaged_singleton<Genode::Core_platform_pd>()->kernel_pd(); }
|
||||||
|
|
||||||
|
@ -85,14 +85,17 @@ void Ipc_node::_cancel_inbuf_request()
|
|||||||
|
|
||||||
void Ipc_node::_announced_request_cancelled(Ipc_node &node)
|
void Ipc_node::_announced_request_cancelled(Ipc_node &node)
|
||||||
{
|
{
|
||||||
if (_caller == &node) _caller = nullptr;
|
if (_caller == &node)
|
||||||
else _request_queue.remove(node._request_queue_item);
|
_caller = nullptr;
|
||||||
|
else
|
||||||
|
_request_queue.remove(node._request_queue_item);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Ipc_node::_outbuf_request_cancelled()
|
void Ipc_node::_outbuf_request_cancelled()
|
||||||
{
|
{
|
||||||
if (_callee == nullptr) return;
|
if (_callee == nullptr)
|
||||||
|
return;
|
||||||
|
|
||||||
_callee = nullptr;
|
_callee = nullptr;
|
||||||
_state = INACTIVE;
|
_state = INACTIVE;
|
||||||
@ -100,7 +103,10 @@ void Ipc_node::_outbuf_request_cancelled()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool Ipc_node::_helps_outbuf_dst() { return (_state == AWAIT_REPLY) && _help; }
|
bool Ipc_node::_helps_outbuf_dst()
|
||||||
|
{
|
||||||
|
return (_state == AWAIT_REPLY) && _help;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
bool Ipc_node::can_send_request()
|
bool Ipc_node::can_send_request()
|
||||||
@ -122,8 +128,10 @@ void Ipc_node::send_request(Ipc_node &callee, bool help)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Thread &Ipc_node::helping_sink() {
|
Thread &Ipc_node::helping_sink()
|
||||||
return _helps_outbuf_dst() ? _callee->helping_sink() : _thread; }
|
{
|
||||||
|
return _helps_outbuf_dst() ? _callee->helping_sink() : _thread;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
bool Ipc_node::can_await_request()
|
bool Ipc_node::can_await_request()
|
||||||
|
@ -18,8 +18,8 @@
|
|||||||
/* Genode includes */
|
/* Genode includes */
|
||||||
#include <util/fifo.h>
|
#include <util/fifo.h>
|
||||||
|
|
||||||
namespace Kernel
|
namespace Kernel {
|
||||||
{
|
|
||||||
class Thread;
|
class Thread;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -138,12 +138,15 @@ class Kernel::Ipc_node
|
|||||||
template <typename F> void for_each_helper(F f)
|
template <typename F> void for_each_helper(F f)
|
||||||
{
|
{
|
||||||
/* if we have a helper in the receive buffer, call 'f' for it */
|
/* if we have a helper in the receive buffer, call 'f' for it */
|
||||||
if (_caller && _caller->_help) f(_caller->_thread);
|
if (_caller && _caller->_help)
|
||||||
|
f(_caller->_thread);
|
||||||
|
|
||||||
/* call 'f' for each helper in our request queue */
|
/* call 'f' for each helper in our request queue */
|
||||||
_request_queue.for_each([f] (Queue_item &item) {
|
_request_queue.for_each([f] (Queue_item &item) {
|
||||||
Ipc_node &node { item.object() };
|
Ipc_node &node { item.object() };
|
||||||
if (node._help) f(node._thread);
|
|
||||||
|
if (node._help)
|
||||||
|
f(node._thread);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -17,12 +17,16 @@
|
|||||||
#include <kernel/irq.h>
|
#include <kernel/irq.h>
|
||||||
|
|
||||||
|
|
||||||
void Kernel::Irq::disable() const {
|
void Kernel::Irq::disable() const
|
||||||
cpu_pool().executing_cpu().pic().mask(_irq_nr); }
|
{
|
||||||
|
cpu_pool().executing_cpu().pic().mask(_irq_nr);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void Kernel::Irq::enable() const {
|
void Kernel::Irq::enable() const
|
||||||
cpu_pool().executing_cpu().pic().unmask(_irq_nr, Cpu::executing_id()); }
|
{
|
||||||
|
cpu_pool().executing_cpu().pic().unmask(_irq_nr, Cpu::executing_id());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
Kernel::Irq::Pool &Kernel::User_irq::_pool()
|
Kernel::Irq::Pool &Kernel::User_irq::_pool()
|
||||||
@ -36,7 +40,8 @@ Kernel::User_irq::User_irq(unsigned const irq,
|
|||||||
Genode::Irq_session::Trigger trigger,
|
Genode::Irq_session::Trigger trigger,
|
||||||
Genode::Irq_session::Polarity polarity,
|
Genode::Irq_session::Polarity polarity,
|
||||||
Signal_context & context)
|
Signal_context & context)
|
||||||
: Irq(irq, _pool()), _context(context)
|
:
|
||||||
|
Irq(irq, _pool()), _context(context)
|
||||||
{
|
{
|
||||||
disable();
|
disable();
|
||||||
cpu_pool().executing_cpu().pic().irq_mode(_irq_nr, trigger, polarity);
|
cpu_pool().executing_cpu().pic().irq_mode(_irq_nr, trigger, polarity);
|
||||||
|
@ -25,8 +25,8 @@
|
|||||||
/* core includes */
|
/* core includes */
|
||||||
#include <kernel/signal_receiver.h>
|
#include <kernel/signal_receiver.h>
|
||||||
|
|
||||||
namespace Kernel
|
namespace Kernel {
|
||||||
{
|
|
||||||
/**
|
/**
|
||||||
* Kernel back-end interface of an interrupt
|
* Kernel back-end interface of an interrupt
|
||||||
*/
|
*/
|
||||||
@ -38,8 +38,9 @@ namespace Kernel
|
|||||||
class User_irq;
|
class User_irq;
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace Genode
|
|
||||||
{
|
namespace Genode {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Core front-end of a user interrupt
|
* Core front-end of a user interrupt
|
||||||
*/
|
*/
|
||||||
@ -78,7 +79,11 @@ class Kernel::Irq : Genode::Avl_node<Irq>
|
|||||||
* \param pool pool this interrupt shall belong to
|
* \param pool pool this interrupt shall belong to
|
||||||
*/
|
*/
|
||||||
Irq(unsigned const irq, Pool &pool)
|
Irq(unsigned const irq, Pool &pool)
|
||||||
: _irq_nr(irq), _pool(pool) { _pool.insert(this); }
|
:
|
||||||
|
_irq_nr(irq), _pool(pool)
|
||||||
|
{
|
||||||
|
_pool.insert(this);
|
||||||
|
}
|
||||||
|
|
||||||
virtual ~Irq() { _pool.remove(this); }
|
virtual ~Irq() { _pool.remove(this); }
|
||||||
|
|
||||||
|
@ -15,8 +15,8 @@
|
|||||||
#ifndef _CORE__SPEC__SMP__KERNEL__LOCK_H_
|
#ifndef _CORE__SPEC__SMP__KERNEL__LOCK_H_
|
||||||
#define _CORE__SPEC__SMP__KERNEL__LOCK_H_
|
#define _CORE__SPEC__SMP__KERNEL__LOCK_H_
|
||||||
|
|
||||||
namespace Kernel
|
namespace Kernel {
|
||||||
{
|
|
||||||
class Lock;
|
class Lock;
|
||||||
|
|
||||||
Lock & data_lock();
|
Lock & data_lock();
|
||||||
|
@ -17,88 +17,95 @@ Object::Object(Thread &obj)
|
|||||||
_obj { (void *)&obj }
|
_obj { (void *)&obj }
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
|
|
||||||
Object::Object(Irq &obj)
|
Object::Object(Irq &obj)
|
||||||
:
|
:
|
||||||
_type { IRQ },
|
_type { IRQ },
|
||||||
_obj { (void *)&obj }
|
_obj { (void *)&obj }
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
|
|
||||||
Object::Object(Signal_receiver &obj)
|
Object::Object(Signal_receiver &obj)
|
||||||
:
|
:
|
||||||
_type { SIGNAL_RECEIVER },
|
_type { SIGNAL_RECEIVER },
|
||||||
_obj { (void *)&obj }
|
_obj { (void *)&obj }
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
|
|
||||||
Object::Object(Signal_context &obj)
|
Object::Object(Signal_context &obj)
|
||||||
:
|
:
|
||||||
_type { SIGNAL_CONTEXT },
|
_type { SIGNAL_CONTEXT },
|
||||||
_obj { (void *)&obj }
|
_obj { (void *)&obj }
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
|
|
||||||
Object::Object(Pd &obj)
|
Object::Object(Pd &obj)
|
||||||
:
|
:
|
||||||
_type { PD },
|
_type { PD },
|
||||||
_obj { (void *)&obj }
|
_obj { (void *)&obj }
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
|
|
||||||
Object::Object(Vm &obj)
|
Object::Object(Vm &obj)
|
||||||
:
|
:
|
||||||
_type { VM },
|
_type { VM },
|
||||||
_obj { (void *)&obj }
|
_obj { (void *)&obj }
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
|
|
||||||
Object::~Object()
|
Object::~Object()
|
||||||
{
|
{
|
||||||
for (Object_identity * oi = first(); oi; oi = first())
|
for (Object_identity * oi = first(); oi; oi = first())
|
||||||
oi->invalidate();
|
oi->invalidate();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
namespace Kernel {
|
namespace Kernel {
|
||||||
|
|
||||||
template <> Pd *Object::obj<Pd>() const
|
template <> Pd *Object::obj<Pd>() const
|
||||||
{
|
{
|
||||||
if (_type != PD) {
|
if (_type != PD)
|
||||||
return nullptr; }
|
return nullptr;
|
||||||
|
|
||||||
return reinterpret_cast<Pd *>(_obj);
|
return reinterpret_cast<Pd *>(_obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <> Irq *Object::obj<Irq>() const
|
template <> Irq *Object::obj<Irq>() const
|
||||||
{
|
{
|
||||||
if (_type != IRQ) {
|
if (_type != IRQ)
|
||||||
return nullptr; }
|
return nullptr;
|
||||||
|
|
||||||
return reinterpret_cast<Irq *>(_obj);
|
return reinterpret_cast<Irq *>(_obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <> Signal_receiver *Object::obj<Signal_receiver>() const
|
template <> Signal_receiver *Object::obj<Signal_receiver>() const
|
||||||
{
|
{
|
||||||
if (_type != SIGNAL_RECEIVER) {
|
if (_type != SIGNAL_RECEIVER)
|
||||||
return nullptr; }
|
return nullptr;
|
||||||
|
|
||||||
return reinterpret_cast<Signal_receiver *>(_obj);
|
return reinterpret_cast<Signal_receiver *>(_obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <> Signal_context *Object::obj<Signal_context>() const
|
template <> Signal_context *Object::obj<Signal_context>() const
|
||||||
{
|
{
|
||||||
if (_type != SIGNAL_CONTEXT) {
|
if (_type != SIGNAL_CONTEXT)
|
||||||
return nullptr; }
|
return nullptr;
|
||||||
|
|
||||||
return reinterpret_cast<Signal_context *>(_obj);
|
return reinterpret_cast<Signal_context *>(_obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <> Thread *Object::obj<Thread>() const
|
template <> Thread *Object::obj<Thread>() const
|
||||||
{
|
{
|
||||||
if (_type != THREAD) {
|
if (_type != THREAD)
|
||||||
return nullptr; }
|
return nullptr;
|
||||||
|
|
||||||
return reinterpret_cast<Thread *>(_obj);
|
return reinterpret_cast<Thread *>(_obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <> Vm *Object::obj<Vm>() const
|
template <> Vm *Object::obj<Vm>() const
|
||||||
{
|
{
|
||||||
if (_type != VM) {
|
if (_type != VM)
|
||||||
return nullptr; }
|
return nullptr;
|
||||||
|
|
||||||
return reinterpret_cast<Vm *>(_obj);
|
return reinterpret_cast<Vm *>(_obj);
|
||||||
}
|
}
|
||||||
@ -122,7 +129,11 @@ void Object_identity::invalidate()
|
|||||||
|
|
||||||
|
|
||||||
Object_identity::Object_identity(Object & object)
|
Object_identity::Object_identity(Object & object)
|
||||||
: _object(&object) { _object->insert(this); }
|
:
|
||||||
|
_object(&object)
|
||||||
|
{
|
||||||
|
_object->insert(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
Object_identity::~Object_identity() { invalidate(); }
|
Object_identity::~Object_identity() { invalidate(); }
|
||||||
@ -135,11 +146,16 @@ Object_identity::~Object_identity() { invalidate(); }
|
|||||||
Object_identity_reference *
|
Object_identity_reference *
|
||||||
Object_identity_reference::find(Pd &pd)
|
Object_identity_reference::find(Pd &pd)
|
||||||
{
|
{
|
||||||
if (!_identity) return nullptr;
|
if (!_identity)
|
||||||
|
return nullptr;
|
||||||
|
|
||||||
for (Object_identity_reference * oir = _identity->first();
|
for (Object_identity_reference * oir = _identity->first();
|
||||||
oir; oir = oir->next())
|
oir; oir = oir->next()) {
|
||||||
if (&pd == &(oir->_pd)) return oir;
|
|
||||||
|
if (&pd == &(oir->_pd))
|
||||||
|
return oir;
|
||||||
|
}
|
||||||
|
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -149,9 +165,12 @@ Object_identity_reference::find(capid_t capid)
|
|||||||
{
|
{
|
||||||
using Avl_node_base = Genode::Avl_node<Object_identity_reference>;
|
using Avl_node_base = Genode::Avl_node<Object_identity_reference>;
|
||||||
|
|
||||||
if (capid == _capid) return this;
|
if (capid == _capid)
|
||||||
|
return this;
|
||||||
|
|
||||||
Object_identity_reference * subtree =
|
Object_identity_reference * subtree =
|
||||||
Avl_node_base::child(capid > _capid);
|
Avl_node_base::child(capid > _capid);
|
||||||
|
|
||||||
return (subtree) ? subtree->find(capid) : nullptr;
|
return (subtree) ? subtree->find(capid) : nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -165,17 +184,23 @@ Object_identity_reference * Object_identity_reference::factory(void * dst,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Object_identity_reference::invalidate() {
|
void Object_identity_reference::invalidate()
|
||||||
if (_identity) _identity->remove(this);
|
{
|
||||||
|
if (_identity)
|
||||||
|
_identity->remove(this);
|
||||||
|
|
||||||
_identity = nullptr;
|
_identity = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Object_identity_reference::Object_identity_reference(Object_identity *oi,
|
Object_identity_reference::Object_identity_reference(Object_identity *oi,
|
||||||
Pd &pd)
|
Pd &pd)
|
||||||
: _capid(pd.capid_alloc().alloc()), _identity(oi), _pd(pd), _in_utcbs(0)
|
:
|
||||||
|
_capid(pd.capid_alloc().alloc()), _identity(oi), _pd(pd), _in_utcbs(0)
|
||||||
{
|
{
|
||||||
if (_identity) _identity->insert(this);
|
if (_identity)
|
||||||
|
_identity->insert(this);
|
||||||
|
|
||||||
_pd.cap_tree().insert(this);
|
_pd.cap_tree().insert(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -188,5 +213,7 @@ Object_identity_reference::~Object_identity_reference()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Object_identity_reference * Object_identity_reference_tree::find(capid_t id) {
|
Object_identity_reference * Object_identity_reference_tree::find(capid_t id)
|
||||||
return (first()) ? first()->find(id) : nullptr; }
|
{
|
||||||
|
return (first()) ? first()->find(id) : nullptr;
|
||||||
|
}
|
||||||
|
@ -25,8 +25,8 @@
|
|||||||
#include <kernel/interface.h>
|
#include <kernel/interface.h>
|
||||||
#include <kernel/kernel.h>
|
#include <kernel/kernel.h>
|
||||||
|
|
||||||
namespace Kernel
|
namespace Kernel {
|
||||||
{
|
|
||||||
/*
|
/*
|
||||||
* Forward declarations
|
* Forward declarations
|
||||||
*/
|
*/
|
||||||
@ -118,8 +118,7 @@ class Kernel::Object : private Object_identity_list
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
class Kernel::Object_identity
|
class Kernel::Object_identity : public Object_identity_list::Element,
|
||||||
: public Object_identity_list::Element,
|
|
||||||
public Kernel::Object_identity_reference_list
|
public Kernel::Object_identity_reference_list
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
@ -145,7 +144,8 @@ class Kernel::Object_identity
|
|||||||
|
|
||||||
|
|
||||||
class Kernel::Object_identity_reference
|
class Kernel::Object_identity_reference
|
||||||
: public Genode::Avl_node<Kernel::Object_identity_reference>,
|
:
|
||||||
|
public Genode::Avl_node<Kernel::Object_identity_reference>,
|
||||||
public Genode::List<Kernel::Object_identity_reference>::Element
|
public Genode::List<Kernel::Object_identity_reference>::Element
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
@ -171,8 +171,10 @@ class Kernel::Object_identity_reference
|
|||||||
***************/
|
***************/
|
||||||
|
|
||||||
template <typename KOBJECT>
|
template <typename KOBJECT>
|
||||||
KOBJECT * object() {
|
KOBJECT * object()
|
||||||
return _identity ? _identity->object<KOBJECT>() : nullptr; }
|
{
|
||||||
|
return _identity ? _identity->object<KOBJECT>() : nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
Object_identity_reference * factory(void * dst, Pd &pd);
|
Object_identity_reference * factory(void * dst, Pd &pd);
|
||||||
|
|
||||||
@ -204,7 +206,8 @@ class Kernel::Object_identity_reference
|
|||||||
|
|
||||||
|
|
||||||
class Kernel::Object_identity_reference_tree
|
class Kernel::Object_identity_reference_tree
|
||||||
: public Genode::Avl_tree<Kernel::Object_identity_reference>
|
:
|
||||||
|
public Genode::Avl_tree<Kernel::Object_identity_reference>
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
@ -24,12 +24,11 @@
|
|||||||
|
|
||||||
#include <util/reconstructible.h>
|
#include <util/reconstructible.h>
|
||||||
|
|
||||||
namespace Genode {
|
namespace Genode { class Platform_pd; }
|
||||||
class Platform_pd;
|
|
||||||
}
|
|
||||||
|
namespace Kernel {
|
||||||
|
|
||||||
namespace Kernel
|
|
||||||
{
|
|
||||||
class Cpu;
|
class Cpu;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -68,8 +67,8 @@ class Kernel::Pd
|
|||||||
*/
|
*/
|
||||||
Pd(Hw::Page_table &table,
|
Pd(Hw::Page_table &table,
|
||||||
Genode::Platform_pd &platform_pd)
|
Genode::Platform_pd &platform_pd)
|
||||||
: _table(table), _platform_pd(platform_pd),
|
:
|
||||||
mmu_regs((addr_t)&table)
|
_table(table), _platform_pd(platform_pd), mmu_regs((addr_t)&table)
|
||||||
{
|
{
|
||||||
capid_t invalid = _capid_alloc.alloc();
|
capid_t invalid = _capid_alloc.alloc();
|
||||||
assert(invalid == cap_id_invalid());
|
assert(invalid == cap_id_invalid());
|
||||||
@ -87,9 +86,9 @@ class Kernel::Pd
|
|||||||
oir->~Object_identity_reference();
|
oir->~Object_identity_reference();
|
||||||
}
|
}
|
||||||
|
|
||||||
static capid_t syscall_create(Genode::Kernel_object<Pd> & p,
|
static capid_t syscall_create(Genode::Kernel_object<Pd> &p,
|
||||||
Hw::Page_table & tt,
|
Hw::Page_table &tt,
|
||||||
Genode::Platform_pd & pd)
|
Genode::Platform_pd &pd)
|
||||||
{
|
{
|
||||||
return call(call_id_new_pd(), (Call_arg)&p,
|
return call(call_id_new_pd(), (Call_arg)&p,
|
||||||
(Call_arg)&tt, (Call_arg)&pd);
|
(Call_arg)&tt, (Call_arg)&pd);
|
||||||
@ -120,7 +119,9 @@ class Kernel::Pd
|
|||||||
|
|
||||||
template<>
|
template<>
|
||||||
inline Kernel::Core_object_identity<Kernel::Pd>::Core_object_identity(Kernel::Pd & pd)
|
inline Kernel::Core_object_identity<Kernel::Pd>::Core_object_identity(Kernel::Pd & pd)
|
||||||
: Object_identity(pd.kernel_object()),
|
:
|
||||||
Object_identity_reference(this, pd.core_pd() ? pd : core_pd()) { }
|
Object_identity(pd.kernel_object()),
|
||||||
|
Object_identity_reference(this, pd.core_pd() ? pd : core_pd())
|
||||||
|
{ }
|
||||||
|
|
||||||
#endif /* _CORE__KERNEL__PD_H_ */
|
#endif /* _CORE__KERNEL__PD_H_ */
|
||||||
|
@ -14,8 +14,8 @@
|
|||||||
#ifndef _CORE__KERNEL__PERF_COUNTER_H_
|
#ifndef _CORE__KERNEL__PERF_COUNTER_H_
|
||||||
#define _CORE__KERNEL__PERF_COUNTER_H_
|
#define _CORE__KERNEL__PERF_COUNTER_H_
|
||||||
|
|
||||||
namespace Kernel
|
namespace Kernel {
|
||||||
{
|
|
||||||
/**
|
/**
|
||||||
* Performance counter
|
* Performance counter
|
||||||
*/
|
*/
|
||||||
|
@ -33,6 +33,7 @@ void Signal_handler::cancel_waiting()
|
|||||||
|
|
||||||
Signal_handler::Signal_handler(Thread &thread) : _thread { thread } { }
|
Signal_handler::Signal_handler(Thread &thread) : _thread { thread } { }
|
||||||
|
|
||||||
|
|
||||||
Signal_handler::~Signal_handler() { cancel_waiting(); }
|
Signal_handler::~Signal_handler() { cancel_waiting(); }
|
||||||
|
|
||||||
|
|
||||||
@ -42,7 +43,8 @@ Signal_handler::~Signal_handler() { cancel_waiting(); }
|
|||||||
|
|
||||||
void Signal_context_killer::cancel_waiting()
|
void Signal_context_killer::cancel_waiting()
|
||||||
{
|
{
|
||||||
if (_context) { _context->_killer_cancelled(); }
|
if (_context)
|
||||||
|
_context->_killer_cancelled();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -61,7 +63,8 @@ Signal_context_killer::~Signal_context_killer() { cancel_waiting(); }
|
|||||||
|
|
||||||
void Signal_context::_deliverable()
|
void Signal_context::_deliverable()
|
||||||
{
|
{
|
||||||
if (_submits) { _receiver._add_deliverable(*this); }
|
if (_submits)
|
||||||
|
_receiver._add_deliverable(*this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -77,27 +80,36 @@ void Signal_context::_killer_cancelled() { _killer = 0; }
|
|||||||
|
|
||||||
bool Signal_context::can_submit(unsigned const n) const
|
bool Signal_context::can_submit(unsigned const n) const
|
||||||
{
|
{
|
||||||
if (_killed || _submits >= (unsigned)~0 - n) { return false; }
|
if (_killed || _submits >= (unsigned)~0 - n)
|
||||||
|
return false;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Signal_context::submit(unsigned const n)
|
void Signal_context::submit(unsigned const n)
|
||||||
{
|
{
|
||||||
if (_killed || _submits >= (unsigned)~0 - n) { return; }
|
if (_killed || _submits >= (unsigned)~0 - n)
|
||||||
|
return;
|
||||||
|
|
||||||
_submits += n;
|
_submits += n;
|
||||||
if (_ack) { _deliverable(); }
|
|
||||||
|
if (_ack)
|
||||||
|
_deliverable();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Signal_context::ack()
|
void Signal_context::ack()
|
||||||
{
|
{
|
||||||
if (_ack) { return; }
|
if (_ack)
|
||||||
|
return;
|
||||||
|
|
||||||
if (!_killed) {
|
if (!_killed) {
|
||||||
_ack = 1;
|
_ack = 1;
|
||||||
_deliverable();
|
_deliverable();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_killer) {
|
if (_killer) {
|
||||||
_killer->_context = 0;
|
_killer->_context = 0;
|
||||||
_killer->_thread.signal_context_kill_done();
|
_killer->_thread.signal_context_kill_done();
|
||||||
@ -110,7 +122,9 @@ bool Signal_context::can_kill() const
|
|||||||
{
|
{
|
||||||
/* check if in a kill operation or already killed */
|
/* check if in a kill operation or already killed */
|
||||||
if (_killed) {
|
if (_killed) {
|
||||||
if (_ack) { return true; }
|
if (_ack)
|
||||||
|
return true;
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
@ -120,14 +134,15 @@ bool Signal_context::can_kill() const
|
|||||||
void Signal_context::kill(Signal_context_killer &k)
|
void Signal_context::kill(Signal_context_killer &k)
|
||||||
{
|
{
|
||||||
/* check if in a kill operation or already killed */
|
/* check if in a kill operation or already killed */
|
||||||
if (_killed) {
|
if (_killed)
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
/* kill directly if there is no unacknowledged delivery */
|
/* kill directly if there is no unacknowledged delivery */
|
||||||
if (_ack) {
|
if (_ack) {
|
||||||
_killed = 1;
|
_killed = 1;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* wait for delivery acknowledgement */
|
/* wait for delivery acknowledgement */
|
||||||
_killer = &k;
|
_killer = &k;
|
||||||
_killed = 1;
|
_killed = 1;
|
||||||
@ -138,13 +153,16 @@ void Signal_context::kill(Signal_context_killer &k)
|
|||||||
|
|
||||||
Signal_context::~Signal_context()
|
Signal_context::~Signal_context()
|
||||||
{
|
{
|
||||||
if (_killer) { _killer->_thread.signal_context_kill_failed(); }
|
if (_killer)
|
||||||
|
_killer->_thread.signal_context_kill_failed();
|
||||||
|
|
||||||
_receiver._context_destructed(*this);
|
_receiver._context_destructed(*this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Signal_context::Signal_context(Signal_receiver & r, addr_t const imprint)
|
Signal_context::Signal_context(Signal_receiver & r, addr_t const imprint)
|
||||||
: _receiver(r),
|
:
|
||||||
|
_receiver(r),
|
||||||
_imprint(imprint)
|
_imprint(imprint)
|
||||||
{
|
{
|
||||||
r._add_context(*this);
|
r._add_context(*this);
|
||||||
@ -157,9 +175,9 @@ Signal_context::Signal_context(Signal_receiver & r, addr_t const imprint)
|
|||||||
|
|
||||||
void Signal_receiver::_add_deliverable(Signal_context &c)
|
void Signal_receiver::_add_deliverable(Signal_context &c)
|
||||||
{
|
{
|
||||||
if (!c._deliver_fe.enqueued()) {
|
if (!c._deliver_fe.enqueued())
|
||||||
_deliver.enqueue(c._deliver_fe);
|
_deliver.enqueue(c._deliver_fe);
|
||||||
}
|
|
||||||
_listen();
|
_listen();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -169,7 +187,8 @@ void Signal_receiver::_listen()
|
|||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
/* check for deliverable signals and waiting handlers */
|
/* check for deliverable signals and waiting handlers */
|
||||||
if (_deliver.empty() || _handlers.empty()) { return; }
|
if (_deliver.empty() || _handlers.empty())
|
||||||
|
return;
|
||||||
|
|
||||||
/* create a signal data-object */
|
/* create a signal data-object */
|
||||||
typedef Genode::Signal_context * Signal_imprint;
|
typedef Genode::Signal_context * Signal_imprint;
|
||||||
@ -196,7 +215,10 @@ void Signal_receiver::_listen()
|
|||||||
void Signal_receiver::_context_destructed(Signal_context &c)
|
void Signal_receiver::_context_destructed(Signal_context &c)
|
||||||
{
|
{
|
||||||
_contexts.remove(c._contexts_fe);
|
_contexts.remove(c._contexts_fe);
|
||||||
if (!c._deliver_fe.enqueued()) { return; }
|
|
||||||
|
if (!c._deliver_fe.enqueued())
|
||||||
|
return;
|
||||||
|
|
||||||
_deliver.remove(c._deliver_fe);
|
_deliver.remove(c._deliver_fe);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -211,14 +233,18 @@ void Signal_receiver::_add_context(Signal_context &c) {
|
|||||||
|
|
||||||
bool Signal_receiver::can_add_handler(Signal_handler const &h) const
|
bool Signal_receiver::can_add_handler(Signal_handler const &h) const
|
||||||
{
|
{
|
||||||
if (h._receiver) { return false; }
|
if (h._receiver)
|
||||||
|
return false;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Signal_receiver::add_handler(Signal_handler &h)
|
void Signal_receiver::add_handler(Signal_handler &h)
|
||||||
{
|
{
|
||||||
if (h._receiver) { return; }
|
if (h._receiver)
|
||||||
|
return;
|
||||||
|
|
||||||
_handlers.enqueue(h._handlers_fe);
|
_handlers.enqueue(h._handlers_fe);
|
||||||
h._receiver = this;
|
h._receiver = this;
|
||||||
h._thread.signal_wait_for_signal();
|
h._thread.signal_wait_for_signal();
|
||||||
|
@ -21,8 +21,8 @@
|
|||||||
#include <kernel/core_interface.h>
|
#include <kernel/core_interface.h>
|
||||||
#include <object.h>
|
#include <object.h>
|
||||||
|
|
||||||
namespace Kernel
|
namespace Kernel {
|
||||||
{
|
|
||||||
class Thread;
|
class Thread;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -77,6 +77,7 @@ class Kernel::Signal_handler
|
|||||||
void cancel_waiting();
|
void cancel_waiting();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
class Kernel::Signal_context_killer
|
class Kernel::Signal_context_killer
|
||||||
{
|
{
|
||||||
friend class Signal_context;
|
friend class Signal_context;
|
||||||
@ -104,6 +105,7 @@ class Kernel::Signal_context_killer
|
|||||||
void cancel_waiting();
|
void cancel_waiting();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
class Kernel::Signal_context
|
class Kernel::Signal_context
|
||||||
{
|
{
|
||||||
friend class Signal_receiver;
|
friend class Signal_receiver;
|
||||||
@ -216,6 +218,7 @@ class Kernel::Signal_context
|
|||||||
Object &kernel_object() { return _kernel_object; }
|
Object &kernel_object() { return _kernel_object; }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
class Kernel::Signal_receiver
|
class Kernel::Signal_receiver
|
||||||
{
|
{
|
||||||
friend class Signal_context;
|
friend class Signal_context;
|
||||||
|
@ -114,7 +114,8 @@ void Thread::ipc_copy_msg(Thread &sender)
|
|||||||
Thread::Tlb_invalidation::Tlb_invalidation(Thread & caller, Pd & pd,
|
Thread::Tlb_invalidation::Tlb_invalidation(Thread & caller, Pd & pd,
|
||||||
addr_t addr, size_t size,
|
addr_t addr, size_t size,
|
||||||
unsigned cnt)
|
unsigned cnt)
|
||||||
: caller(caller), pd(pd), addr(addr), size(size), cnt(cnt)
|
:
|
||||||
|
caller(caller), pd(pd), addr(addr), size(size), cnt(cnt)
|
||||||
{
|
{
|
||||||
cpu_pool().work_list().insert(&_le);
|
cpu_pool().work_list().insert(&_le);
|
||||||
caller._become_inactive(AWAITS_RESTART);
|
caller._become_inactive(AWAITS_RESTART);
|
||||||
@ -122,7 +123,8 @@ Thread::Tlb_invalidation::Tlb_invalidation(Thread & caller, Pd & pd,
|
|||||||
|
|
||||||
|
|
||||||
Thread::Destroy::Destroy(Thread & caller, Genode::Kernel_object<Thread> & to_delete)
|
Thread::Destroy::Destroy(Thread & caller, Genode::Kernel_object<Thread> & to_delete)
|
||||||
: caller(caller), thread_to_destroy(to_delete)
|
:
|
||||||
|
caller(caller), thread_to_destroy(to_delete)
|
||||||
{
|
{
|
||||||
thread_to_destroy->_cpu->work_list().insert(&_le);
|
thread_to_destroy->_cpu->work_list().insert(&_le);
|
||||||
caller._become_inactive(AWAITS_RESTART);
|
caller._become_inactive(AWAITS_RESTART);
|
||||||
@ -229,6 +231,7 @@ void Thread::_deactivate_used_shares()
|
|||||||
thread._deactivate_used_shares(); });
|
thread._deactivate_used_shares(); });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Thread::_activate_used_shares()
|
void Thread::_activate_used_shares()
|
||||||
{
|
{
|
||||||
Cpu_job::_activate_own_share();
|
Cpu_job::_activate_own_share();
|
||||||
@ -236,6 +239,7 @@ void Thread::_activate_used_shares()
|
|||||||
thread._activate_used_shares(); });
|
thread._activate_used_shares(); });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Thread::_become_active()
|
void Thread::_become_active()
|
||||||
{
|
{
|
||||||
if (_state != ACTIVE && !_paused) { _activate_used_shares(); }
|
if (_state != ACTIVE && !_paused) { _activate_used_shares(); }
|
||||||
@ -820,7 +824,8 @@ Thread::Thread(unsigned const priority, unsigned const quota,
|
|||||||
:
|
:
|
||||||
Kernel::Object { *this },
|
Kernel::Object { *this },
|
||||||
Cpu_job(priority, quota), _ipc_node(*this), _state(AWAITS_START),
|
Cpu_job(priority, quota), _ipc_node(*this), _state(AWAITS_START),
|
||||||
_label(label), _core(core), regs(core) { }
|
_label(label), _core(core), regs(core)
|
||||||
|
{ }
|
||||||
|
|
||||||
|
|
||||||
Thread::~Thread() { _ipc_free_recv_caps(); }
|
Thread::~Thread() { _ipc_free_recv_caps(); }
|
||||||
@ -842,7 +847,8 @@ Genode::uint8_t __initial_stack_base[DEFAULT_STACK_SIZE];
|
|||||||
*****************/
|
*****************/
|
||||||
|
|
||||||
Core_thread::Core_thread()
|
Core_thread::Core_thread()
|
||||||
: Core_object<Thread>("core")
|
:
|
||||||
|
Core_object<Thread>("core")
|
||||||
{
|
{
|
||||||
using namespace Genode;
|
using namespace Genode;
|
||||||
|
|
||||||
|
@ -32,9 +32,7 @@
|
|||||||
/* base-local includes */
|
/* base-local includes */
|
||||||
#include <base/internal/native_utcb.h>
|
#include <base/internal/native_utcb.h>
|
||||||
|
|
||||||
|
namespace Kernel {
|
||||||
namespace Kernel
|
|
||||||
{
|
|
||||||
struct Thread_fault;
|
struct Thread_fault;
|
||||||
class Thread;
|
class Thread;
|
||||||
class Core_thread;
|
class Core_thread;
|
||||||
@ -114,8 +112,7 @@ class Kernel::Thread : private Kernel::Object, public Cpu_job, private Timeout
|
|||||||
|
|
||||||
enum { START_VERBOSE = 0 };
|
enum { START_VERBOSE = 0 };
|
||||||
|
|
||||||
enum State
|
enum State {
|
||||||
{
|
|
||||||
ACTIVE = 1,
|
ACTIVE = 1,
|
||||||
AWAITS_START = 2,
|
AWAITS_START = 2,
|
||||||
AWAITS_IPC = 3,
|
AWAITS_IPC = 3,
|
||||||
|
@ -24,7 +24,9 @@ void Timer::Irq::occurred() { _cpu.scheduler().timeout(); }
|
|||||||
|
|
||||||
|
|
||||||
Timer::Irq::Irq(unsigned id, Cpu &cpu)
|
Timer::Irq::Irq(unsigned id, Cpu &cpu)
|
||||||
: Kernel::Irq(id, cpu.irq_pool()), _cpu(cpu) {}
|
:
|
||||||
|
Kernel::Irq(id, cpu.irq_pool()), _cpu(cpu)
|
||||||
|
{ }
|
||||||
|
|
||||||
|
|
||||||
time_t Timer::timeout_max_us() const
|
time_t Timer::timeout_max_us() const
|
||||||
@ -39,10 +41,10 @@ void Timer::set_timeout(Timeout * const timeout, time_t const duration)
|
|||||||
* Remove timeout if it is already in use. Timeouts may get overridden as
|
* Remove timeout if it is already in use. Timeouts may get overridden as
|
||||||
* result of an update.
|
* result of an update.
|
||||||
*/
|
*/
|
||||||
if (timeout->_listed) {
|
if (timeout->_listed)
|
||||||
_timeout_list.remove(timeout);
|
_timeout_list.remove(timeout);
|
||||||
} else {
|
else
|
||||||
timeout->_listed = true; }
|
timeout->_listed = true;
|
||||||
|
|
||||||
/* set timeout parameters */
|
/* set timeout parameters */
|
||||||
timeout->_end = time() + duration;
|
timeout->_end = time() + duration;
|
||||||
@ -84,8 +86,12 @@ void Timer::process_timeouts()
|
|||||||
time_t t = time();
|
time_t t = time();
|
||||||
while (true) {
|
while (true) {
|
||||||
Timeout * const timeout = _timeout_list.first();
|
Timeout * const timeout = _timeout_list.first();
|
||||||
if (!timeout) { break; }
|
if (!timeout)
|
||||||
if (timeout->_end > t) { break; }
|
break;
|
||||||
|
|
||||||
|
if (timeout->_end > t)
|
||||||
|
break;
|
||||||
|
|
||||||
_timeout_list.remove(timeout);
|
_timeout_list.remove(timeout);
|
||||||
timeout->_listed = false;
|
timeout->_listed = false;
|
||||||
timeout->timeout_triggered();
|
timeout->timeout_triggered();
|
||||||
@ -94,7 +100,8 @@ void Timer::process_timeouts()
|
|||||||
|
|
||||||
|
|
||||||
Timer::Timer(Cpu & cpu)
|
Timer::Timer(Cpu & cpu)
|
||||||
: _device(cpu.id()), _irq(interrupt_id(), cpu),
|
:
|
||||||
|
_device(cpu.id()), _irq(interrupt_id(), cpu),
|
||||||
_last_timeout_duration(_max_value())
|
_last_timeout_duration(_max_value())
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
|
@ -23,13 +23,13 @@
|
|||||||
|
|
||||||
#include <board.h>
|
#include <board.h>
|
||||||
|
|
||||||
namespace Kernel
|
namespace Kernel {
|
||||||
{
|
|
||||||
class Cpu;
|
class Cpu;
|
||||||
class Timeout;
|
class Timeout;
|
||||||
class Timer;
|
class Timer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A timeout causes a kernel pass and the call of a timeout specific handle
|
* A timeout causes a kernel pass and the call of a timeout specific handle
|
||||||
*/
|
*/
|
||||||
@ -53,6 +53,7 @@ class Kernel::Timeout : Genode::List<Timeout>::Element
|
|||||||
virtual ~Timeout() { }
|
virtual ~Timeout() { }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A timer manages a continuous time and timeouts on it
|
* A timer manages a continuous time and timeouts on it
|
||||||
*/
|
*/
|
||||||
|
@ -24,8 +24,8 @@ namespace Genode { class Vm_state; }
|
|||||||
|
|
||||||
#include <board.h>
|
#include <board.h>
|
||||||
|
|
||||||
namespace Kernel
|
namespace Kernel {
|
||||||
{
|
|
||||||
/**
|
/**
|
||||||
* Kernel backend for a virtual machine
|
* Kernel backend for a virtual machine
|
||||||
*/
|
*/
|
||||||
@ -128,7 +128,9 @@ class Kernel::Vm : private Kernel::Object, public Cpu_job
|
|||||||
|
|
||||||
void pause()
|
void pause()
|
||||||
{
|
{
|
||||||
if (_scheduled != INACTIVE) Cpu_job::_deactivate_own_share();
|
if (_scheduled != INACTIVE)
|
||||||
|
Cpu_job::_deactivate_own_share();
|
||||||
|
|
||||||
_scheduled = INACTIVE;
|
_scheduled = INACTIVE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -32,6 +32,9 @@ void Kernel::log(char const c)
|
|||||||
|
|
||||||
static Serial serial { Genode::Platform::mmio_to_virt(UART_BASE),
|
static Serial serial { Genode::Platform::mmio_to_virt(UART_BASE),
|
||||||
UART_CLOCK, BAUD_RATE };
|
UART_CLOCK, BAUD_RATE };
|
||||||
if (c == ASCII_LINE_FEED) serial.put_char(ASCII_CARRIAGE_RETURN);
|
|
||||||
|
if (c == ASCII_LINE_FEED)
|
||||||
|
serial.put_char(ASCII_CARRIAGE_RETURN);
|
||||||
|
|
||||||
serial.put_char(c);
|
serial.put_char(c);
|
||||||
}
|
}
|
||||||
|
@ -16,14 +16,22 @@
|
|||||||
|
|
||||||
using namespace Genode;
|
using namespace Genode;
|
||||||
|
|
||||||
void Native_pd_component::upgrade_cap_slab() {
|
|
||||||
|
void Native_pd_component::upgrade_cap_slab()
|
||||||
|
{
|
||||||
_pd_session._pd->upgrade_slab(_pd_session._sliced_heap);
|
_pd_session._pd->upgrade_slab(_pd_session._sliced_heap);
|
||||||
//throw Out_of_ram();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Native_pd_component::Native_pd_component(Pd_session_component &pd, char const *)
|
Native_pd_component::Native_pd_component(Pd_session_component &pd, char const *)
|
||||||
: _pd_session(pd) { _pd_session._ep.manage(this); }
|
:
|
||||||
|
_pd_session(pd)
|
||||||
|
{
|
||||||
|
_pd_session._ep.manage(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
Native_pd_component::~Native_pd_component() { _pd_session._ep.dissolve(this); }
|
Native_pd_component::~Native_pd_component()
|
||||||
|
{
|
||||||
|
_pd_session._ep.dissolve(this);
|
||||||
|
}
|
||||||
|
@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
#include <hw/memory_map.h>
|
#include <hw/memory_map.h>
|
||||||
|
|
||||||
|
|
||||||
Genode::Native_utcb * Genode::utcb_main_thread() {
|
Genode::Native_utcb * Genode::utcb_main_thread() {
|
||||||
return (Genode::Native_utcb*) Hw::Mm::core_utcb_main_thread().base; }
|
return (Genode::Native_utcb*) Hw::Mm::core_utcb_main_thread().base; }
|
||||||
|
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user