Oppure

Loading
26/03/13 20:44
LittleHacker
Salve a tutti, sto portando avanti il mio progetto: "MudStorm OS", e ho un problema per quanto riguarda lo spegnimento della Macchina virtuale!

Prima usavo questo codice:
asm("movw Salve a tutti, sto portando avanti il mio progetto: "MudStorm OS", e ho un problema per quanto riguarda lo spegnimento della Macchina virtuale!


Prima usavo questo codice:
asm("movw {parsed_message}x1000,%ax;"
	    "movw %ax,%ss;"
	    "movw {parsed_message}xf000,%sp;"
	    "movw {parsed_message}x5307,%ax;"
	    "movw ,%bx;"
	    "movw ,%cx;"
	    "int  {parsed_message}x15;");


Che però non mi spegneva la macchina, ma la mandava in crash con eccezzione: "General Protection Fault Exception"!"
Adesso, uso questo codice:

__asm__ __volatile__ ("cli");
__asm__ __volatile__ ("hlt");


Questo non la manda in crash, blocca gli interrupt, ma rimane sempre attiva, io invece vorrei che si spegnesse completamente, con la chiusura della macchina! Come posso fare?
Grazie mille! :k:x1000,%ax;" "movw %ax,%ss;" "movw Salve a tutti, sto portando avanti il mio progetto: "MudStorm OS", e ho un problema per quanto riguarda lo spegnimento della Macchina virtuale!

Prima usavo questo codice:
asm("movw {parsed_message}x1000,%ax;"
	    "movw %ax,%ss;"
	    "movw {parsed_message}xf000,%sp;"
	    "movw {parsed_message}x5307,%ax;"
	    "movw ,%bx;"
	    "movw ,%cx;"
	    "int  {parsed_message}x15;");


Che però non mi spegneva la macchina, ma la mandava in crash con eccezzione: "General Protection Fault Exception"!"
Adesso, uso questo codice:

__asm__ __volatile__ ("cli");
__asm__ __volatile__ ("hlt");


Questo non la manda in crash, blocca gli interrupt, ma rimane sempre attiva, io invece vorrei che si spegnesse completamente, con la chiusura della macchina! Come posso fare?
Grazie mille! :k:xf000,%sp;" "movw Salve a tutti, sto portando avanti il mio progetto: "MudStorm OS", e ho un problema per quanto riguarda lo spegnimento della Macchina virtuale!

Prima usavo questo codice:
asm("movw {parsed_message}x1000,%ax;"
	    "movw %ax,%ss;"
	    "movw {parsed_message}xf000,%sp;"
	    "movw {parsed_message}x5307,%ax;"
	    "movw ,%bx;"
	    "movw ,%cx;"
	    "int  {parsed_message}x15;");


Che però non mi spegneva la macchina, ma la mandava in crash con eccezzione: "General Protection Fault Exception"!"
Adesso, uso questo codice:

__asm__ __volatile__ ("cli");
__asm__ __volatile__ ("hlt");


Questo non la manda in crash, blocca gli interrupt, ma rimane sempre attiva, io invece vorrei che si spegnesse completamente, con la chiusura della macchina! Come posso fare?
Grazie mille! :k:x5307,%ax;" "movw ,%bx;" "movw ,%cx;" "int Salve a tutti, sto portando avanti il mio progetto: "MudStorm OS", e ho un problema per quanto riguarda lo spegnimento della Macchina virtuale!

Prima usavo questo codice:
asm("movw {parsed_message}x1000,%ax;"
	    "movw %ax,%ss;"
	    "movw {parsed_message}xf000,%sp;"
	    "movw {parsed_message}x5307,%ax;"
	    "movw ,%bx;"
	    "movw ,%cx;"
	    "int  {parsed_message}x15;");


Che però non mi spegneva la macchina, ma la mandava in crash con eccezzione: "General Protection Fault Exception"!"
Adesso, uso questo codice:

__asm__ __volatile__ ("cli");
__asm__ __volatile__ ("hlt");


Questo non la manda in crash, blocca gli interrupt, ma rimane sempre attiva, io invece vorrei che si spegnesse completamente, con la chiusura della macchina! Come posso fare?
Grazie mille! :k:x15;");


Che però non mi spegneva la macchina, ma la mandava in crash con eccezzione: "General Protection Fault Exception"!"
Adesso, uso questo codice:

__asm__ __volatile__ ("cli");
__asm__ __volatile__ ("hlt");


Questo non la manda in crash, blocca gli interrupt, ma rimane sempre attiva, io invece vorrei che si spegnesse completamente, con la chiusura della macchina! Come posso fare?
Grazie mille! :k:
aaa
27/03/13 7:42
tasx
ciao,

qui -> stackoverflow.com/questions/678458/… alcune risposte fanno al caso tuo... ;)

ciao
aaa
27/03/13 20:33
LittleHacker
Postato originariamente da tasx:

ciao,

qui -> stackoverflow.com/questions/678458/… alcune risposte fanno al caso tuo... ;)

ciao


Avevo già provato, ma non funzionano!
Invece ho trovato questo:
__asm__ __volatile__ ("cli");
__asm__ __volatile__ ("outw %1, %0" : : "dN" ((unsigned short)0xB004), "a" ((unsigned short)0x2000));


E funziona! :rotfl: :k:
Grazie lo stesso per la risposta! :k:

Edit:
Questo codice funziona solo su QEMU(altre VM non le ho provate), ma su Macchina Reale no!

ReEdit:

Ho trovato un codice che funziona su tutte le VM (non testato su Bochs), ma sempre no su quella Reale :grr: ! Comunque ecco il codice:

	// Questa è l'istruzione vecchia che spegneva solo la macchina virtuale QEMU!
	//asm volatile ("outw %1, %0" : : "dN" ((unsigned short)0xB004), "a" ((unsigned short)0x2000));
	
	// Questa è quella nuova che spegne tutte le VM, ma non quelle reali!
	asm volatile ("cli");
  	for (;;)
  	{
	      // Funziona per QEMU e Bochs
      	      outportw (0xB004, 0x2000);
	
	      // Magic shutdown per Bochs e QEMU
	      for (const char *s = "Shutdown"; *s; ++s)
		        outportb (0x8900, *s);

	      // Magic code per VMWare
	      asm volatile ("cli; hlt");
	}


Ringrazio github.com/Kijewski/chaOS/blob/master/core/… per il codice!
Ultima modifica effettuata da LittleHacker 31/03/13 22:07
aaa