set hwd eflags

This commit is contained in:
Basile Burg 2016-09-30 09:36:53 +02:00
parent b60c08b8a0
commit 8832ae387c
No known key found for this signature in database
GPG Key ID: 1868039F415CB8CF
1 changed files with 15 additions and 17 deletions

View File

@ -134,7 +134,7 @@ type
procedure setInspectableRegister(index: TSegRegister; value: TCPUSegValue); procedure setInspectableRegister(index: TSegRegister; value: TCPUSegValue);
end; end;
TSetFlagEvent = procedure(reg: TFlag; val: boolean) of object; TSetFlagEvent = procedure(val: PtrUint) of object;
TSetFprEvent = procedure(reg: TFpuRegister; val: extended) of object; TSetFprEvent = procedure(reg: TFpuRegister; val: extended) of object;
@ -165,7 +165,7 @@ type
end; end;
// Makes a category for the local variables in an object inspector // Makes a category for the local variables in an object inspector
TInspectableLocals= class(TPersistent) TInspectableLocals = class(TPersistent)
private private
fLocals: TStringList; fLocals: TStringList;
fPropIndex: integer; fPropIndex: integer;
@ -185,6 +185,7 @@ type
// Stores the registers content, to be displayable in an object inspector. // Stores the registers content, to be displayable in an object inspector.
TInspectableCPU = class(TPersistent) TInspectableCPU = class(TPersistent)
private private
fFullFlags: PtrUint;
fFlags: TFlags; fFlags: TFlags;
fSetFlagEvent: TSetFlagEvent; fSetFlagEvent: TSetFlagEvent;
fGpr: TInspectableGPR; fGpr: TInspectableGPR;
@ -200,7 +201,7 @@ type
constructor create(setGprEvent: TSetGprEvent; setSsrEvent: TSetSsrEvent; constructor create(setGprEvent: TSetGprEvent; setSsrEvent: TSetSsrEvent;
setFlagEvent: TSetFlagEvent; setFprEvent: TSetFprEvent); setFlagEvent: TSetFlagEvent; setFprEvent: TSetFprEvent);
destructor destroy; override; destructor destroy; override;
procedure setInspectableFlags(value: word); procedure setInspectableFlags(value: PtrUint);
end; end;
// Represents an item in the call stack // Represents an item in the call stack
@ -371,7 +372,7 @@ type
procedure setGpr(reg: TCpuRegister; val: TCpuGprValue); procedure setGpr(reg: TCpuRegister; val: TCpuGprValue);
procedure setFpr(reg: TFpuRegister; val: extended); procedure setFpr(reg: TFpuRegister; val: extended);
procedure setSsr(reg: TSegRegister; val: TCPUSegValue); procedure setSsr(reg: TSegRegister; val: TCPUSegValue);
procedure setFlag(reg: TFLAG; val: boolean); procedure setFlag(val: PtrUint);
// //
procedure projNew(project: ICECommonProject); procedure projNew(project: ICECommonProject);
procedure projChanged(project: ICECommonProject); procedure projChanged(project: ICECommonProject);
@ -774,10 +775,13 @@ begin
inherited; inherited;
end; end;
procedure TInspectableCPU.setInspectableFlags(value: word); procedure TInspectableCPU.setInspectableFlags(value: PtrUint);
var var
flg: TFlag; flg: TFlag;
begin begin
if fFullFlags = value then
exit;
fFullFlags:=value;
fFlags:= []; fFlags:= [];
for flg in TFlag do for flg in TFlag do
if (value and FlagValues[flg]) >= FlagValues[flg] then if (value and FlagValues[flg]) >= FlagValues[flg] then
@ -791,11 +795,10 @@ begin
if fFlags = value then if fFlags = value then
exit; exit;
for flg in TFlag do for flg in TFlag do
begin
if (flg in value) <> (flg in fFlags) then if (flg in value) <> (flg in fFlags) then
fSetFlagEvent(flg, flg in value); fFullFlags:= fFullFlags xor FlagValues[flg];
end;
fFlags := value; fFlags := value;
fSetFlagEvent(fFullFlags);
end; end;
{$ENDREGION} {$ENDREGION}
@ -1617,7 +1620,7 @@ begin
end; end;
flagOffset: flagOffset:
begin begin
fInspState.setInspectableFlags(word(val.AsInteger)); fInspState.setInspectableFlags({$IFDEF CPU64}val.AsInt64{$ELSE}val.AsInteger{$ENDIF});
end; end;
segOffset..segOffset+5: segOffset..segOffset+5:
begin begin
@ -1641,7 +1644,6 @@ begin
end; end;
end; end;
// TODO-cGDB: get SSE registers // TODO-cGDB: get SSE registers
// TODO-cGDB: get EFLAGS
end; end;
end; end;
stateViewer.RefreshPropertyValues; stateViewer.RefreshPropertyValues;
@ -1883,17 +1885,13 @@ begin
gdbCommand(cmd); gdbCommand(cmd);
end; end;
procedure TCEGdbWidget.setFlag(reg: TFLAG; val: boolean); procedure TCEGdbWidget.setFlag(val: PtrUint);
const const
// TODO-cGDB: set eflags from expr fails with "invalid cast" spec = 'set $eflags = 0x%X';
spec: array[boolean] of string = (
'set $eflags &= ~0x%X',
'set $eflags |= 0x%X'
);
var var
cmd: string; cmd: string;
begin begin
cmd := format(spec[val], [FlagValues[reg]]); cmd := format(spec, [val]);
gdbCommand(cmd); gdbCommand(cmd);
end; end;