Windows 8.1がインストールされたPCで用があってUEFIの下記設定変更を行い。
・ディバイスの起動順の変更
・UEFIのセキュアブートの無効化
別のディバイスからブートして作業。作業終了後UEFIの設定を元にもどそうと設定画面に入るためのキーを押すが設定画面が表示されないし、Windowsも起動しない。
しょうがなく、電源ボタン長押しで電源断後、再度電源ボタンを押して暫くするとWindowsは起動した。
そんな事があったので対処法をメモ。
管理者権限のあるコマンドプロンプトで
shutdown /r /o
/r - Full shutdown and restart computer
/o - Go to the advanced options menu and restart computer. Must be used with /r option.
すると再起動後に"オプションの選択"という画面が表示されるので、トラブルシューティング]-[詳細オプション]-[UEFI ファームウェアの設定]の順にクリックする。
2014年5月30日金曜日
2014年5月22日木曜日
Unmask floating point exception
x86 なプロセッサ上のLinuxでは、浮動小数点同士の除算でゼロ割を行ってもSIGFPEは普通発生しない。これは、FPU control word*1 というFPUのレジスタ中のFloating point exception のマスク状態を表すフラグが立っているためである。
gfortran -ffpe-trap=zero というオプションを指定すると浮動小数点のゼロ割でSIGFPEが発生するようになる。今回は、gcc インラインアセンブラでFloating point exception のマスクを解除してみた。
#include <stdio.h>
int
main(void)
{
double a,b,c;
unsigned short int fctr;
a=3.0;
b=0.0;
c=1.0;
asm volatile(
"fstcw %w1\n\t" // get FPU control word
"fdiv %3,%2"
:"=&t"(c):"m"(fctr),"f"(a),"f"(b));
printf("c= %f FPU control word= %X\n", c, fctr);
fctr = fctr ^ 0x4;
printf("Value for FPU control word= %X\n", fctr);
asm volatile(
"fldcw %w1\n\t" // set operand to FPU control word
"fdiv %3,%2"
:"=&t"(c):"m"(fctr),"f"(a),"f"(b));
printf("c= %f FPU control word= %X\n", c, fctr);
return 0;
}
[実行結果]
$ ./a.out
c= inf FPU control word= 37F
Value for FPU control word= 37B
Floating exception (core dumped)
*1 Intel® 64 and IA-32 Architectures Software Developer’s Manual Combined Volumes: 1, 2A, 2B, 2C, 3A, 3B, and 3C p.p.189-190
登録:
投稿 (Atom)