The original keyboard reset does not wait a for short period, so we see
the triple fault being triggered even if the keyboard reset is
successful sometimes. Added a wait there to make sure the keyboard reset
completes before triggering the triple fault.
Added PCI reset, and enabled ACPI reset. ACPI reset does not work
currently on kvm and qemu, but nevertheless we should try it first.
Signed-off-by: YuChen Qian <yuc...@amazon.de>
Reviewed-by: Hendrik Borghorst <hbor...@amazon.de>
Reviewed-by: Marius Hillenbrand <mhil...@amazon.de>
Cc-Team: kaos-brimstone <kaos-br...@amazon.com>
CR: https://code.amazon.com/reviews/CR-14659421
---
arch/x64/power.cc | 30 +++++++++++++++++++++++-------
1 file changed, 23 insertions(+), 7 deletions(-)
diff --git a/arch/x64/power.cc b/arch/x64/power.cc
index 61d56bcc..d62ed84e 100644
--- a/arch/x64/power.cc
+++ b/arch/x64/power.cc
@@ -54,16 +54,32 @@ void poweroff(void)
halt();
}
+void pci_reboot(void) {
+ u8 v = processor::inb(0x0cf9) & ~6;
+ processor::outb(v|2, 0x0cf9); // request hard reset
+ usleep(50);
+ processor::outb(v|6, 0x0cf9); // actually do the reset
+ usleep(50);
+ // Method 5: Cause triple fault by loading a broken IDT and triggering an
// interrupt.
processor::lidt(processor::desc_ptr(0, 0));
__asm__ __volatile__("int3");
--
2.17.1
Amazon Development Center Germany GmbH
Krausenstr. 38
10117 Berlin
Geschaeftsfuehrung: Christian Schlaeger, Ralf Herbrich
Eingetragen am Amtsgericht Charlottenburg unter HRB 149173 B
Sitz: Berlin
Ust-ID: DE 289 237 879
--
You received this message because you are subscribed to the Google Groups "OSv Development" group.
To unsubscribe from this group and stop receiving emails from it, send an email to osv-dev+u...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/osv-dev/20191127134607.15293-1-yuchenq%40amazon.de.
Hi, thanks for the patch! I have some questions:
On Wed, Nov 27, 2019 at 3:46 PM 'YuChen Qian' via OSv Development <osv...@googlegroups.com> wrote:
The original keyboard reset does not wait a for short period, so we see
the triple fault being triggered even if the keyboard reset is
successful sometimes. Added a wait there to make sure the keyboard reset
completes before triggering the triple fault.
Out of curiosity, what is the downside of not waiting, and trying another reboot method even if the previous one will have eventually worked?Isn't the end-result the same - that it will reboot?Is the risk that the machine will reboot for a second time right after the first one?
Added PCI reset, and enabled ACPI reset. ACPI reset does not work
currently on kvm and qemu, but nevertheless we should try it first.
Signed-off-by: YuChen Qian <yuc...@amazon.de>
Reviewed-by: Hendrik Borghorst <hbor...@amazon.de>
Reviewed-by: Marius Hillenbrand <mhil...@amazon.de>
Cc-Team: kaos-brimstone <kaos-br...@amazon.com>
CR: https://code.amazon.com/reviews/CR-14659421
---
arch/x64/power.cc | 30 +++++++++++++++++++++++-------
1 file changed, 23 insertions(+), 7 deletions(-)
diff --git a/arch/x64/power.cc b/arch/x64/power.cc
index 61d56bcc..d62ed84e 100644
--- a/arch/x64/power.cc
+++ b/arch/x64/power.cc
@@ -54,16 +54,32 @@ void poweroff(void)
halt();
}
+void pci_reboot(void) {
Please make these functions "static", so they are not visible from outside this source file (there is no reason why they should be).
+ u8 v = processor::inb(0x0cf9) & ~6;
+ processor::outb(v|2, 0x0cf9); // request hard reset
+ usleep(50);
+ processor::outb(v|6, 0x0cf9); // actually do the reset
+ usleep(50);
Nice, I wasn't familiar with this method before.
Is it really necessary to write 0x2 once, wait, and then write 0x2 | 0x4 ("6") in a second write?Won't a single write of 6 - once - work, as the (virtual) hardware realizes that both 0x4 (do a reset) and 0x2 (make it a hardware reset) bits are turned on?
Thanks for the comment :) Please see my reply in the comments.
On 27.11.19 15:43, Nadav Har'El wrote:
I think, it is better to look at the Intel spec for this question. The reset control register is located at offset CF9h. Bit 0 is reserved, bit 1 is used for system reset (SYS_RST), bit 2 is used for reset cpu (RST_CPU), bit 3 is used for full reset (FULL_RST), and bit4-7 are also reserved.
+ u8 v = processor::inb(0x0cf9) & ~6;
+ processor::outb(v|2, 0x0cf9); // request hard reset
+ usleep(50);
+ processor::outb(v|6, 0x0cf9); // actually do the reset
+ usleep(50);
Nice, I wasn't familiar with this method before.
Is it really necessary to write 0x2 once, wait, and then write 0x2 | 0x4 ("6") in a second write?Won't a single write of 6 - once - work, as the (virtual) hardware realizes that both 0x4 (do a reset) and 0x2 (make it a hardware reset) bits are turned on?
"If SYS_RST is 0 when RST_CPU goes from 0 to 1, then the PMC will force INIT# active for 16 PCI clocks. If SYS_RST is 1 when RST_CPU goes from 0 to 1, then the PMC will force PCI reset active for about 1 ms, however the PMU_SLP_S3_B and PMU_SLP_S4_B signals assertion is dependent on the value of the FULL_RST.
The RST_CPU bit will cause either a hard or soft reset to the CPU depending on the state of the SYS_RST The software will cause the reset by setting bit 2 from a 0 to a 1."
In other words, we need to first set the SYS_RST to 1, and then set the RST_CPU to 1 (which forces a hard reset). The wait probably matters more on real hardware.
Linux also implemented this reset method similarly, in arch/x86/kernel/reboot.c
--
You received this message because you are subscribed to the Google Groups "OSv Development" group.
To unsubscribe from this group and stop receiving emails from it, send an email to osv-dev+u...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/osv-dev/20191128142931.22753-1-yuchenq%40amazon.de.