diff --git a/thermosphere/src/gicv2.h b/thermosphere/src/gicv2.h new file mode 100644 index 000000000..ac6358a86 --- /dev/null +++ b/thermosphere/src/gicv2.h @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2019 Atmosphère-NX + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once + +#include "types.h" + +typedef struct ArmGicV2Distributor { + u32 ctlr; + u32 typer; + u32 iidr; + u8 _0x0c[0x80 - 0x0C]; + // Note: in reality only 512 interrupts max. are defined (nor "reserved") on Gicv2 + u32 igroupr[1024 / 32]; + u32 isenabler[1024 / 32]; + u32 icenabler[1024 / 32]; + u32 ispendr[1024 / 32]; + u32 icpendr[1024 / 32]; + u32 isactiver[1024 / 32]; + u32 icactiver[1024 / 32]; + u8 ipriorityr[1024]; // can be accessed as u8 or u32 + u8 itargetsr[1024]; // can be accessed as u8 or u32 + u32 icfgr[1024 / 16]; + u8 impldef_d00[0xF00 - 0xD00]; + u32 sgir; + u8 _0xf04[0xF10 - 0xF04]; + u32 cpendsgir[4]; + u32 spendsgir[4]; + u8 _0xf30[0x1000 - 0xF30]; +} ArmGicV2Distributor; + +typedef struct ArmGicV2Controller { + u32 ctlr; + u32 pmr; + u32 bpr; + u32 iar; + u32 eoir; + u32 rpr; + u32 hppir; + u32 abpr; + u32 aiar; + u32 aeoir; + u32 ahppir; + u8 _0x2c[0x40 - 0x2C]; + u8 impldef_40[0xD0 - 0x40]; + u32 apr[4]; + u32 nsapr[4]; + u8 _0xf0[0xFC - 0xF0]; + u32 iidr; + u8 _0x100[0x1000 - 0x100]; + u32 dir; + u8 _0x1004[0x2000 - 0x1004]; +} ArmGicV2Controller; + +typedef struct ArmGicV2VirtualInterfaceController { + u32 hcr; + u32 vtr; + u32 vmcr; + u8 _0x0c[0x10 - 0xC]; + u32 misr; + u8 _0x14[0x20 - 0x14]; + u32 eisr0; + u32 eisr1; + u8 _0x28[0x30 - 0x28]; + u32 elsr0; + u32 elsr1; + u8 _0x38[0xF0 - 0x38]; + u32 apr; + u8 _0xf4[0x100 - 0xF4]; + u32 lr[64]; +} ArmGicV2VirtualInterfaceController; + + +typedef struct ArmGicV2 { + volatile ArmGicV2Distributor *gicd; + volatile ArmGicV2Controller *gicc; + volatile ArmGicV2VirtualInterfaceController *gich; + volatile ArmGicV2Controller *gicv; +} ArmGicV2; diff --git a/thermosphere/src/platform/interrupt_config.h b/thermosphere/src/platform/interrupt_config.h new file mode 100644 index 000000000..1bb3f8dfa --- /dev/null +++ b/thermosphere/src/platform/interrupt_config.h @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2019 Atmosphère-NX + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once + +#ifdef PLATFORM_TEGRA + +#include "tegra/interrupt_config.h" + +#elif defined(PLATFORM_QEMU) + +#include "qemu/interrupt_config.h" + +#endif diff --git a/thermosphere/src/platform/qemu/interrupt_config.h b/thermosphere/src/platform/qemu/interrupt_config.h new file mode 100644 index 000000000..84b626c8d --- /dev/null +++ b/thermosphere/src/platform/qemu/interrupt_config.h @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2019 Atmosphère-NX + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once + +#include "../../gicv2.h" + +// For both guest and host +#define MAX_NUM_REGISTERED_INTERRUPTS 512 + +static inline void initGicv2Pointers(ArmGicV2 *gic) +{ + gic->gicd = (volatile ArmGicV2Distributor *)0x08000000ull; + gic->gicc = (volatile ArmGicV2Controller *)0x08010000ull; + gic->gich = (volatile ArmGicV2VirtualInterfaceController *)0x08030000ull; + gic->gicv = (volatile ArmGicV2Controller *)0x08040000ull; +} \ No newline at end of file diff --git a/thermosphere/src/platform/tegra/interrupt_config.h b/thermosphere/src/platform/tegra/interrupt_config.h new file mode 100644 index 000000000..0470f1a27 --- /dev/null +++ b/thermosphere/src/platform/tegra/interrupt_config.h @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2019 Atmosphère-NX + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once + +#include "../../gicv2.h" + +// For both guest and host +#define MAX_NUM_REGISTERED_INTERRUPTS 512 + +static inline void initGicv2Pointers(ArmGicV2 *gic) +{ + gic->gicd = (volatile ArmGicV2Distributor *)0x50041000ull; + gic->gicc = (volatile ArmGicV2Controller *)0x50042000ull; + gic->gich = (volatile ArmGicV2VirtualInterfaceController *)0x50044000ull; + gic->gicv = (volatile ArmGicV2Controller *)0x50046000ull; +} \ No newline at end of file