Congratulations are due to Lars Wassermann, the GSoC student on the ARM Jitter for Squeak VM project, who has got as far as implementing a plugin for an ARM simulator that passes all its tests and can evaluate fibonacci.  Lars is making great progress.<br>
<br><div>e.g.</div><div><br></div><div><div>nfib</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>&quot;long fib(long n) { return n &lt;= 1 ? 1 : fib(n-1) + fib(n-2) + 1; }</div><div><span class="Apple-tab-span" style="white-space:pre">        </span> as compiled by arm-elf-gnuabi-gcc fib.c -c -marm</div>
<div><span class="Apple-tab-span" style="white-space:pre">        </span>also, the jumps are changed by hand.&quot;</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>&quot;| bat nfib ip |</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>bat := GdbARMAlienTests new.</div>
<div><span class="Apple-tab-span" style="white-space:pre">        </span>nfib := bat nfib asWordArray.</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>ip := 0.</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>23 timesRepeat:</div>
<div><span class="Apple-tab-span" style="white-space:pre">                </span>[bat processor disassembleInstructionAt: ip In: nfib into:</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>[:da :len|</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>Transcript nextPutAll: da; cr; flush.</div>
<div><span class="Apple-tab-span" style="white-space:pre">                        </span>ip := ip + len]]&quot;</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>^#(&quot;00000000 &lt;fib&gt;:</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>   0:&quot;<span class="Apple-tab-span" style="white-space:pre">                </span>16re92d4810 <span class="Apple-tab-span" style="white-space:pre">                </span>&quot;push<span class="Apple-tab-span" style="white-space:pre">        </span>{r4, fp, lr}<span class="Apple-tab-span" style="white-space:pre">        </span>fp = r11, sp is changed in this command</div>
<div><span class="Apple-tab-span" style="white-space:pre">        </span>   4:&quot;<span class="Apple-tab-span" style="white-space:pre">                </span>16re28db008 <span class="Apple-tab-span" style="white-space:pre">                </span>&quot;add<span class="Apple-tab-span" style="white-space:pre">        </span>fp, sp, #8<span class="Apple-tab-span" style="white-space:pre">        </span>now, the frame pointer is changed</div>
<div><span class="Apple-tab-span" style="white-space:pre">        </span>   8:&quot;<span class="Apple-tab-span" style="white-space:pre">                </span>16re24dd00c <span class="Apple-tab-span" style="white-space:pre">                </span>&quot;sub<span class="Apple-tab-span" style="white-space:pre">        </span>sp, sp, #12</div>
<div><span class="Apple-tab-span" style="white-space:pre">        </span>   c:&quot;<span class="Apple-tab-span" style="white-space:pre">                </span>16re50b0010 <span class="Apple-tab-span" style="white-space:pre">                </span>&quot;str<span class="Apple-tab-span" style="white-space:pre">        </span>r0, [fp, #-16]</div>
<div><span class="Apple-tab-span" style="white-space:pre">        </span>  10:&quot;<span class="Apple-tab-span" style="white-space:pre">                </span>16re51b3010 <span class="Apple-tab-span" style="white-space:pre">                </span>&quot;ldr<span class="Apple-tab-span" style="white-space:pre">        </span>r3, [fp, #-16]<span class="Apple-tab-span" style="white-space:pre">        </span>r3 &lt;- [fp-16] &lt;- r0</div>
<div><span class="Apple-tab-span" style="white-space:pre">        </span>  14:&quot;<span class="Apple-tab-span" style="white-space:pre">                </span>16re3530001 <span class="Apple-tab-span" style="white-space:pre">                </span>&quot;cmp<span class="Apple-tab-span" style="white-space:pre">        </span>r3, #1</div>
<div><span class="Apple-tab-span" style="white-space:pre">        </span>  18:&quot;<span class="Apple-tab-span" style="white-space:pre">                </span>16rda00000c <span class="Apple-tab-span" style="white-space:pre">                </span>&quot;ble<span class="Apple-tab-span" style="white-space:pre">        </span>50 &lt;fib+0x50&gt;</div>
<div><span class="Apple-tab-span" style="white-space:pre">        </span>  1c:&quot;<span class="Apple-tab-span" style="white-space:pre">                </span>16re51b3010 <span class="Apple-tab-span" style="white-space:pre">                </span>&quot;ldr<span class="Apple-tab-span" style="white-space:pre">        </span>r3, [fp, #-16]</div>
<div><span class="Apple-tab-span" style="white-space:pre">        </span>  20:&quot;<span class="Apple-tab-span" style="white-space:pre">                </span>16re2433001 <span class="Apple-tab-span" style="white-space:pre">                </span>&quot;sub<span class="Apple-tab-span" style="white-space:pre">        </span>r3, r3, #1</div>
<div><span class="Apple-tab-span" style="white-space:pre">        </span>  24:&quot;<span class="Apple-tab-span" style="white-space:pre">                </span>16re1a00003 <span class="Apple-tab-span" style="white-space:pre">                </span>&quot;mov<span class="Apple-tab-span" style="white-space:pre">        </span>r0, r3</div>
<div><span class="Apple-tab-span" style="white-space:pre">        </span>  28:&quot;<span class="Apple-tab-span" style="white-space:pre">                </span>16rebfffff4 <span class="Apple-tab-span" style="white-space:pre">                </span>&quot;bl<span class="Apple-tab-span" style="white-space:pre">        </span>0 &lt;fib&gt;</div>
<div><span class="Apple-tab-span" style="white-space:pre">        </span>  2c:&quot;<span class="Apple-tab-span" style="white-space:pre">                </span>16re1a04000 <span class="Apple-tab-span" style="white-space:pre">                </span>&quot;mov<span class="Apple-tab-span" style="white-space:pre">        </span>r4, r0</div>
<div><span class="Apple-tab-span" style="white-space:pre">        </span>  30:&quot;<span class="Apple-tab-span" style="white-space:pre">                </span>16re51b3010 <span class="Apple-tab-span" style="white-space:pre">                </span>&quot;ldr<span class="Apple-tab-span" style="white-space:pre">        </span>r3, [fp, #-16]</div>
<div><span class="Apple-tab-span" style="white-space:pre">        </span>  34:&quot;<span class="Apple-tab-span" style="white-space:pre">                </span>16re2433002<span class="Apple-tab-span" style="white-space:pre">        </span> <span class="Apple-tab-span" style="white-space:pre">        </span>&quot;sub<span class="Apple-tab-span" style="white-space:pre">        </span>r3, r3, #2</div>
<div><span class="Apple-tab-span" style="white-space:pre">        </span>  38:&quot;<span class="Apple-tab-span" style="white-space:pre">                </span>16re1a00003 <span class="Apple-tab-span" style="white-space:pre">                </span>&quot;mov<span class="Apple-tab-span" style="white-space:pre">        </span>r0, r3</div>
<div><span class="Apple-tab-span" style="white-space:pre">        </span>  3c:&quot;<span class="Apple-tab-span" style="white-space:pre">                </span>16rebffffef <span class="Apple-tab-span" style="white-space:pre">                </span>&quot;bl<span class="Apple-tab-span" style="white-space:pre">        </span>0 &lt;fib&gt;</div>
<div><span class="Apple-tab-span" style="white-space:pre">        </span>  40:&quot;<span class="Apple-tab-span" style="white-space:pre">                </span>16re1a03000 <span class="Apple-tab-span" style="white-space:pre">                </span>&quot;mov<span class="Apple-tab-span" style="white-space:pre">        </span>r3, r0</div>
<div><span class="Apple-tab-span" style="white-space:pre">        </span>  44:&quot;<span class="Apple-tab-span" style="white-space:pre">                </span>16re0843003 <span class="Apple-tab-span" style="white-space:pre">                </span>&quot;add<span class="Apple-tab-span" style="white-space:pre">        </span>r3, r4, r3</div>
<div><span class="Apple-tab-span" style="white-space:pre">        </span>  48:&quot;<span class="Apple-tab-span" style="white-space:pre">                </span>16re2833001 <span class="Apple-tab-span" style="white-space:pre">                </span>&quot;add<span class="Apple-tab-span" style="white-space:pre">        </span>r3, r3, #1</div>
<div><span class="Apple-tab-span" style="white-space:pre">        </span>  4c:&quot;<span class="Apple-tab-span" style="white-space:pre">                </span>16rea000000 <span class="Apple-tab-span" style="white-space:pre">                </span>&quot;b<span class="Apple-tab-span" style="white-space:pre">        </span>54 &lt;fib+0x54&gt;</div>
<div><span class="Apple-tab-span" style="white-space:pre">        </span>  50:&quot;<span class="Apple-tab-span" style="white-space:pre">                </span>16re3a03001 <span class="Apple-tab-span" style="white-space:pre">                </span>&quot;mov<span class="Apple-tab-span" style="white-space:pre">        </span>r3, #1</div>
<div><span class="Apple-tab-span" style="white-space:pre">        </span>  54:&quot;<span class="Apple-tab-span" style="white-space:pre">                </span>16re1a00003 <span class="Apple-tab-span" style="white-space:pre">                </span>&quot;mov<span class="Apple-tab-span" style="white-space:pre">        </span>r0, r3</div>
<div><span class="Apple-tab-span" style="white-space:pre">        </span>  58:&quot;<span class="Apple-tab-span" style="white-space:pre">                </span>16re24bd008 <span class="Apple-tab-span" style="white-space:pre">                </span>&quot;sub<span class="Apple-tab-span" style="white-space:pre">        </span>sp, fp, #8</div>
<div><span class="Apple-tab-span" style="white-space:pre">        </span>  5c:&quot;<span class="Apple-tab-span" style="white-space:pre">                </span>16re8bd8810 <span class="Apple-tab-span" style="white-space:pre">                </span>&quot;pop<span class="Apple-tab-span" style="white-space:pre">        </span>{r4, fp, pc}&quot;)</div>
<div><br></div><div class="gmail_quote">On Wed, Jul 11, 2012 at 12:47 PM,  <span dir="ltr">&lt;<a href="mailto:commits@source.squeak.org" target="_blank">commits@source.squeak.org</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
Eliot Miranda uploaded a new version of Cog to project VM Maker:<br>
<a href="http://source.squeak.org/VMMaker/Cog-lw.48.mcz" target="_blank">http://source.squeak.org/VMMaker/Cog-lw.48.mcz</a><br>
<br>
==================== Summary ====================<br>
<br>
Name: Cog-lw.48<br>
Author: lw<br>
Time: 11 July 2012, 9:13:45.865 pm<br>
UUID: 5ae3e465-4b2c-2349-9b88-77b8f53d5acd<br>
Ancestors: Cog-eem.47<br>
<br>
Added the GdbARMAlien, together with its tests and the plugin.<br>
Additionally, introduced CogProcessorAlien as a common superclass for BochsIA32Alien and GdbARMAlien to increase code reusage.<br>
<br>
The same might be possible for the Plugins (BochsIA32/GdbARM), because they are also identical.<br>
<br>
=============== Diff against Cog-eem.47 ===============<br>
<br>
Item was changed:<br>
+ CogProcessorAlien variableByteSubclass: #BochsIA32Alien<br>
- Alien variableByteSubclass: #BochsIA32Alien<br>
        instanceVariableNames: &#39;&#39;<br>
        classVariableNames: &#39;OpcodeExceptionMap PostBuildStackDelta&#39;<br>
        poolDictionaries: &#39;&#39;<br>
        category: &#39;Cog-Processors&#39;!<br>
<br>
  !BochsIA32Alien commentStamp: &#39;&lt;historical&gt;&#39; prior: 0!<br>
  I am a wrapper around the Bochs C++ IA32 CPU emulator.  Note that currently I provide no access to the x87/mmx FPU state, only providing access to the SSE/xmm registers.<br>
<br>
  Here is the configure script for the configuration this code assumes.  Offsets of fields will change with different configurations so they must agree.<br>
<br>
  ----8&lt;---- conf.COG ----8&lt;----<br>
  #!!/bin/sh<br>
<br>
  # this sets up the compile for Cog.  Disable as much inessential stuff<br>
  # as possible leaving only the cpu/fpu &amp; memory interface<br>
<br>
  set echo<br>
  # CFLAGS=&quot;-pipe -O3 -fomit-frame-pointer -finline-functions -falign-loops=16 -falign-jumps=16 -falign-functions=16 -falign-labels=16 -falign-loops-max-skip=15 -falign-jumps-max-skip=15 -fprefetch-loop-arrays $CFLAGS&quot;<br>

  CFLAGS=&quot;-m32 $CFLAGS&quot;<br>
  CFLAGS=&quot;-Dlongjmp=_longjmp -Dsetjmp=_setjmp $CFLAGS&quot;<br>
  CFLAGS=&quot;-pipe -O3 -fomit-frame-pointer -finline-functions $CFLAGS&quot;<br>
  CFLAGS=&quot;-g $CFLAGS&quot;<br>
  CPATH=&quot;/sw/include&quot;<br>
  CPPFLAGS=&quot;&quot;<br>
  CXXFLAGS=&quot;$CFLAGS&quot;<br>
  LDFLAGS=&quot;-L/sw/lib&quot;<br>
<br>
  export CFLAGS<br>
  export CPATH<br>
  export CPPFLAGS<br>
  export CXXFLAGS<br>
  export LDFLAGS<br>
<br>
  ./configure --enable-Cog \<br>
        --enable-cpu-level=6 \<br>
        --enable-sse=2 \<br>
        --enable-assert-checks \<br>
        --with-nogui \<br>
                --disable-x86-64 \<br>
                --disable-pae \<br>
                --disable-large-pages \<br>
                --disable-global-pages \<br>
                --disable-mtrr \<br>
                --disable-sb16 \<br>
                --disable-ne2000 \<br>
                --disable-pci \<br>
                --disable-acpi \<br>
                --disable-apic \<br>
                --disable-clgd54xx \<br>
                --disable-usb \<br>
                --disable-plugins \<br>
        ${CONFIGURE_ARGS}<br>
<br>
  # apic == Advanced programmable Interrupt Controller<br>
  # acpi == Advanced Configuration and Power Interface<br>
  # pci == Peripheral Component Interconnect local bus<br>
  # clgd54xx == Cirrus Logic GD54xx video card<br>
  ----8&lt;---- conf.COG ----8&lt;----!<br>
<br>
Item was removed:<br>
- ----- Method: BochsIA32Alien&gt;&gt;disassembleFrom:to:in:on: (in category &#39;disassembly&#39;) -----<br>
- disassembleFrom: startAddress to: endAddress in: memory on: aStream<br>
-       | address |<br>
-       address := startAddress.<br>
-       [address &lt; endAddress] whileTrue:<br>
-               [[:size :string|<br>
-               aStream nextPutAll: string; cr; flush.<br>
-               address := address + size]<br>
-                       valueWithArguments: (self<br>
-                                                                       primitiveDisassembleAt: address<br>
-                                                                       inMemory: memory)]!<br>
<br>
Item was removed:<br>
- ----- Method: BochsIA32Alien&gt;&gt;disassembleInstructionAt:In: (in category &#39;disassembly&#39;) -----<br>
- disassembleInstructionAt: pc In: memory<br>
-       ^(self primitiveDisassembleAt: pc inMemory: memory) last!<br>
<br>
Item was removed:<br>
- ----- Method: BochsIA32Alien&gt;&gt;disassembleInstructionAt:In:into: (in category &#39;disassembly&#39;) -----<br>
- disassembleInstructionAt: ip In: memory into: aBlock<br>
-       | lenAndDi |<br>
-       lenAndDi := self primitiveDisassembleAt: ip inMemory: memory.<br>
-       ^aBlock value: lenAndDi last value: lenAndDi first!<br>
<br>
Item was removed:<br>
- ----- Method: BochsIA32Alien&gt;&gt;disassembleNextInstructionIn: (in category &#39;disassembly&#39;) -----<br>
- disassembleNextInstructionIn: memory<br>
-       ^(self primitiveDisassembleAt: self eip inMemory: memory) last!<br>
<br>
Item was removed:<br>
- ----- Method: BochsIA32Alien&gt;&gt;runInMemory: (in category &#39;execution&#39;) -----<br>
- runInMemory: aMemory<br>
-       | result |<br>
-       result := self primitiveRunInMemory: aMemory minimumAddress: 0 readOnlyBelow: 0.<br>
-       result ~~ self ifTrue:<br>
-               [self error: &#39;eek!!&#39;]!<br>
<br>
Item was removed:<br>
- ----- Method: BochsIA32Alien&gt;&gt;runInMemory:minimumAddress:readOnlyBelow: (in category &#39;execution&#39;) -----<br>
- runInMemory: aMemory minimumAddress: minimumAddress readOnlyBelow: minimumWritableAddress<br>
-       | result |<br>
-       result := self primitiveRunInMemory: aMemory<br>
-                               minimumAddress: minimumAddress<br>
-                               readOnlyBelow: minimumWritableAddress.<br>
-       result ~~ self ifTrue:<br>
-               [self error: &#39;eek!!&#39;]!<br>
<br>
Item was removed:<br>
- ----- Method: BochsIA32Alien&gt;&gt;runInMemory:readExecuteOnlyBelow: (in category &#39;execution&#39;) -----<br>
- runInMemory: aMemory readExecuteOnlyBelow: minWriteMaxExecAddr<br>
-       | result |<br>
-       result := self primitiveRunInMemory: aMemory minimumAddress: 0 readOnlyBelow: minWriteMaxExecAddr.<br>
-       result ~~ self ifTrue:<br>
-               [self error: &#39;eek!!&#39;]!<br>
<br>
Item was removed:<br>
- ----- Method: BochsIA32Alien&gt;&gt;singleStepIn: (in category &#39;execution&#39;) -----<br>
- singleStepIn: aMemory<br>
-       | result |<br>
-       result := self primitiveSingleStepInMemory: aMemory minimumAddress: 0 readOnlyBelow: aMemory size.<br>
-       result ~~ self ifTrue:<br>
-               [self error: &#39;eek!!&#39;]!<br>
<br>
Item was removed:<br>
- ----- Method: BochsIA32Alien&gt;&gt;singleStepIn:minimumAddress:readOnlyBelow: (in category &#39;execution&#39;) -----<br>
- singleStepIn: aMemory minimumAddress: minimumAddress readOnlyBelow: minimumWritableAddress<br>
-       | result |<br>
-       result := self primitiveSingleStepInMemory: aMemory<br>
-                               minimumAddress: minimumAddress<br>
-                               readOnlyBelow: minimumWritableAddress.<br>
-       result ~~ self ifTrue:<br>
-               [self error: &#39;eek!!&#39;]!<br>
<br>
Item was removed:<br>
- ----- Method: BochsIA32Alien&gt;&gt;singleStepIn:readExecuteOnlyBelow: (in category &#39;execution&#39;) -----<br>
- singleStepIn: aMemory readExecuteOnlyBelow: minWriteMaxExecAddr<br>
-       | result |<br>
-       result := self primitiveSingleStepInMemory: aMemory minimumAddress: 0 readOnlyBelow: minWriteMaxExecAddr.<br>
-       result ~~ self ifTrue:<br>
-               [self error: &#39;eek!!&#39;]!<br>
<br>
Item was added:<br>
+ Alien variableByteSubclass: #CogProcessorAlien<br>
+       instanceVariableNames: &#39;&#39;<br>
+       classVariableNames: &#39;&#39;<br>
+       poolDictionaries: &#39;&#39;<br>
+       category: &#39;Cog-Processors&#39;!<br>
<br>
Item was added:<br>
+ ----- Method: CogProcessorAlien&gt;&gt;abstractInstructionCompilerClass (in category &#39;Cog API&#39;) -----<br>
+ abstractInstructionCompilerClass<br>
+       self subclassResponsibility!<br>
<br>
Item was added:<br>
+ ----- Method: CogProcessorAlien&gt;&gt;callOpcode (in category &#39;opcodes&#39;) -----<br>
+ callOpcode<br>
+       self subclassResponsibility.!<br>
<br>
Item was added:<br>
+ ----- Method: CogProcessorAlien&gt;&gt;disassembleFrom:to:in:on: (in category &#39;disassembly&#39;) -----<br>
+ disassembleFrom: startAddress to: endAddress in: memory on: aStream<br>
+       | address |<br>
+       address := startAddress.<br>
+       [address &lt; endAddress] whileTrue:<br>
+               [[:size :string|<br>
+               aStream nextPutAll: string; cr; flush.<br>
+               address := address + size]<br>
+                       valueWithArguments: (self<br>
+                                                                       primitiveDisassembleAt: address<br>
+                                                                       inMemory: memory)]!<br>
<br>
Item was added:<br>
+ ----- Method: CogProcessorAlien&gt;&gt;disassembleInstructionAt:In: (in category &#39;disassembly&#39;) -----<br>
+ disassembleInstructionAt: pc In: memory<br>
+       ^(self primitiveDisassembleAt: pc inMemory: memory) last!<br>
<br>
Item was added:<br>
+ ----- Method: CogProcessorAlien&gt;&gt;disassembleInstructionAt:In:into: (in category &#39;disassembly&#39;) -----<br>
+ disassembleInstructionAt: ip In: memory into: aBlock<br>
+       | lenAndDi |<br>
+       lenAndDi := self primitiveDisassembleAt: ip inMemory: memory.<br>
+       ^aBlock value: lenAndDi last value: lenAndDi first!<br>
<br>
Item was added:<br>
+ ----- Method: CogProcessorAlien&gt;&gt;disassembleNextInstructionIn: (in category &#39;disassembly&#39;) -----<br>
+ disassembleNextInstructionIn: memory<br>
+       ^(self primitiveDisassembleAt: self pc inMemory: memory) last!<br>
<br>
Item was added:<br>
+ ----- Method: CogProcessorAlien&gt;&gt;nopOpcode (in category &#39;opcodes&#39;) -----<br>
+ nopOpcode<br>
+       self subclassResponsibility.!<br>
<br>
Item was added:<br>
+ ----- Method: CogProcessorAlien&gt;&gt;printRegisterState:on: (in category &#39;printing&#39;) -----<br>
+ printRegisterState: registerStateVector on: aStream<br>
+<br>
+       self subclassResponsibility.!<br>
<br>
Item was added:<br>
+ ----- Method: CogProcessorAlien&gt;&gt;printRegistersOn: (in category &#39;printing&#39;) -----<br>
+ printRegistersOn: aStream<br>
+       self printRegisterState: self registerState on: aStream.<br>
+       aStream flush!<br>
<br>
Item was added:<br>
+ ----- Method: CogProcessorAlien&gt;&gt;reportPrimitiveFailure (in category &#39;error handling&#39;) -----<br>
+ reportPrimitiveFailure<br>
+       | errorAndLog |<br>
+       errorAndLog := self primitiveErrorAndLog.<br>
+       self error: &#39;Error &#39;, errorAndLog first printString, (errorAndLog last ifNil: [&#39;&#39;] ifNotNil: [:log| &#39;: &#39;, log])!<br>
<br>
Item was added:<br>
+ ----- Method: CogProcessorAlien&gt;&gt;runInMemory: (in category &#39;execution&#39;) -----<br>
+ runInMemory: aMemory<br>
+       | result |<br>
+       result := self primitiveRunInMemory: aMemory minimumAddress: 0 readOnlyBelow: 0.<br>
+       result ~~ self ifTrue:<br>
+               [self error: &#39;eek!!&#39;]!<br>
<br>
Item was added:<br>
+ ----- Method: CogProcessorAlien&gt;&gt;runInMemory:minimumAddress:readOnlyBelow: (in category &#39;execution&#39;) -----<br>
+ runInMemory: aMemory minimumAddress: minimumAddress readOnlyBelow: minimumWritableAddress<br>
+       | result |<br>
+       result := self primitiveRunInMemory: aMemory<br>
+                               minimumAddress: minimumAddress<br>
+                               readOnlyBelow: minimumWritableAddress.<br>
+       result ~~ self ifTrue:<br>
+               [self error: &#39;eek!!&#39;]!<br>
<br>
Item was added:<br>
+ ----- Method: CogProcessorAlien&gt;&gt;runInMemory:readExecuteOnlyBelow: (in category &#39;execution&#39;) -----<br>
+ runInMemory: aMemory readExecuteOnlyBelow: minWriteMaxExecAddr<br>
+       | result |<br>
+       result := self primitiveRunInMemory: aMemory minimumAddress: 0 readOnlyBelow: minWriteMaxExecAddr.<br>
+       result ~~ self ifTrue:<br>
+               [self error: &#39;eek!!&#39;]!<br>
<br>
Item was added:<br>
+ ----- Method: CogProcessorAlien&gt;&gt;singleStepIn: (in category &#39;execution&#39;) -----<br>
+ singleStepIn: aMemory<br>
+       | result |<br>
+       result := self primitiveSingleStepInMemory: aMemory minimumAddress: 0 readOnlyBelow: aMemory size.<br>
+       result ~~ self ifTrue:<br>
+               [self error: &#39;eek!!&#39;]!<br>
<br>
Item was added:<br>
+ ----- Method: CogProcessorAlien&gt;&gt;singleStepIn:minimumAddress:readOnlyBelow: (in category &#39;execution&#39;) -----<br>
+ singleStepIn: aMemory minimumAddress: minimumAddress readOnlyBelow: minimumWritableAddress<br>
+       | result |<br>
+       result := self primitiveSingleStepInMemory: aMemory<br>
+                               minimumAddress: minimumAddress<br>
+                               readOnlyBelow: minimumWritableAddress.<br>
+       result ~~ self ifTrue:<br>
+               [self error: &#39;eek!!&#39;]!<br>
<br>
Item was added:<br>
+ ----- Method: CogProcessorAlien&gt;&gt;singleStepIn:readExecuteOnlyBelow: (in category &#39;execution&#39;) -----<br>
+ singleStepIn: aMemory readExecuteOnlyBelow: minWriteMaxExecAddr<br>
+       | result |<br>
+       result := self primitiveSingleStepInMemory: aMemory minimumAddress: 0 readOnlyBelow: minWriteMaxExecAddr.<br>
+       result ~~ self ifTrue:<br>
+               [self error: &#39;eek!!&#39;]!<br>
<br>
Item was added:<br>
+ CogProcessorAlien variableByteSubclass: #GdbARMAlien<br>
+       instanceVariableNames: &#39;&#39;<br>
+       classVariableNames: &#39;OpcodeExceptionMap PostBuildStackDelta&#39;<br>
+       poolDictionaries: &#39;&#39;<br>
+       category: &#39;Cog-Processors&#39;!<br>
<br>
Item was added:<br>
+ ----- Method: GdbARMAlien class&gt;&gt;dataSize (in category &#39;instance creation&#39;) -----<br>
+ dataSize<br>
+<br>
+       ^1536!<br>
<br>
Item was added:<br>
+ ----- Method: GdbARMAlien class&gt;&gt;defaultIntegerBaseInDebugger (in category &#39;debugger&#39;) -----<br>
+ defaultIntegerBaseInDebugger<br>
+       ^16!<br>
<br>
Item was added:<br>
+ ----- Method: GdbARMAlien class&gt;&gt;new (in category &#39;instance creation&#39;) -----<br>
+ new<br>
+       ^(self atAddress: self primitiveNewCPU) reset!<br>
<br>
Item was added:<br>
+ ----- Method: GdbARMAlien class&gt;&gt;primitiveNewCPU (in category &#39;primitives&#39;) -----<br>
+ primitiveNewCPU<br>
+       &quot;Answer the address of a new ARMulator C type ARMul_State instance.&quot;<br>
+       &lt;primitive: &#39;primitiveNewCPU&#39; module: &#39;GdbARMPlugin&#39;&gt;<br>
+       ^self primitiveFailed!<br>
<br>
Item was added:<br>
+ ----- Method: GdbARMAlien&gt;&gt;abstractInstructionCompilerClass (in category &#39;Cog API&#39;) -----<br>
+ abstractInstructionCompilerClass<br>
+       ^CogARMCompiler!<br>
<br>
Item was added:<br>
+ ----- Method: GdbARMAlien&gt;&gt;branchAndLinkOpcodeWithOffset: (in category &#39;opcodes&#39;) -----<br>
+ branchAndLinkOpcodeWithOffset: aNumber<br>
+<br>
+       | offset |<br>
+       offset := (aNumber - 8) asInteger &gt;&gt; 2.<br>
+       (offset bitAnd: 16rFF000000) ~= 0 ifTrue: [self error: &#39;The offset is to far. ARM does not support such far jumps.&#39;].<br>
+       ^ 16reb000000 bitOr: (offset bitAnd: 16r00FFFFFF)!<br>
<br>
Item was added:<br>
+ ----- Method: GdbARMAlien&gt;&gt;callOpcode (in category &#39;opcodes&#39;) -----<br>
+ callOpcode<br>
+       &quot;The call command does not generally exist. The most similar would be bl &lt;offset&gt;&quot;<br>
+       ^ self branchAndLinkOpcodeWithOffset: 0.!<br>
<br>
Item was added:<br>
+ ----- Method: GdbARMAlien&gt;&gt;cflag (in category &#39;accessing&#39;) -----<br>
+ cflag<br>
+       ^self unsignedLongAt: 577!<br>
<br>
Item was added:<br>
+ ----- Method: GdbARMAlien&gt;&gt;eflags (in category &#39;accessing&#39;) -----<br>
+ eflags<br>
+<br>
+       ^ (((self nflag &lt;&lt; 5 bitOr: self zflag &lt;&lt; 4)<br>
+                       bitOr: self cflag &lt;&lt; 3)<br>
+                               bitOr: self vflag &lt;&lt; 2)<br>
+                                       bitOr: self ifflags!<br>
<br>
Item was added:<br>
+ ----- Method: GdbARMAlien&gt;&gt;handleExecutionPrimitiveFailureIn:minimumAddress:readOnlyBelow: (in category &#39;error handling&#39;) -----<br>
+ handleExecutionPrimitiveFailureIn: memoryArray &quot;&lt;Bitmap|ByteArray&gt;&quot; minimumAddress: minimumAddress &quot;&lt;Integer&gt;&quot; readOnlyBelow: minimumWritableAddress &quot;&lt;Integer&gt;&quot;<br>
+       &quot;Handle an execution primitive failure.  Convert out-of-range call and absolute<br>
+        memory read into register instructions into ProcessorSimulationTrap signals.&quot;<br>
+       &quot;self printIntegerRegistersOn: Transcript&quot;<br>
+       &quot;self printRegistersOn: Transcript&quot;<br>
+<br>
+       &quot;| pc opcode |<br>
+       ((pc := self pc) between: minimumAddress and: memoryArray byteSize - 1) ifTrue:<br>
+               [opcode := memoryArray byteAt: pc + 1.<br>
+               ^self<br>
+                       perform: (OpcodeExceptionMap at: opcode + 1)<br>
+                       with: pc<br>
+                       with: memoryArray<br>
+                       with: minimumWritableAddress].&quot;<br>
+       ^self reportPrimitiveFailure!<br>
<br>
Item was added:<br>
+ ----- Method: GdbARMAlien&gt;&gt;ifflags (in category &#39;accessing&#39;) -----<br>
+ ifflags<br>
+       ^self unsignedLongAt: 585!<br>
<br>
Item was added:<br>
+ ----- Method: GdbARMAlien&gt;&gt;integerRegisterState (in category &#39;accessing-abstract&#39;) -----<br>
+ integerRegisterState<br>
+       ^{      self r0. self r1. self r2. self r3. self r4. self r5. self r6. self r7. self r8.<br>
+               self r9. self r10. self r11. self r12. self sp. self lr. self pc}!<br>
<br>
Item was added:<br>
+ ----- Method: GdbARMAlien&gt;&gt;lr (in category &#39;accessing&#39;) -----<br>
+ lr<br>
+       ^self unsignedLongAt: 69!<br>
<br>
Item was added:<br>
+ ----- Method: GdbARMAlien&gt;&gt;lr: (in category &#39;accessing&#39;) -----<br>
+ lr: anUnsignedInteger<br>
+<br>
+       ^self unsignedLongAt: 69 put: anUnsignedInteger!<br>
<br>
Item was added:<br>
+ ----- Method: GdbARMAlien&gt;&gt;nflag (in category &#39;accessing&#39;) -----<br>
+ nflag<br>
+       ^self unsignedLongAt: 569!<br>
<br>
Item was added:<br>
+ ----- Method: GdbARMAlien&gt;&gt;nopOpcode (in category &#39;opcodes&#39;) -----<br>
+ nopOpcode<br>
+       &quot;mov r0, r0&quot;<br>
+       ^ 16rE1A01001!<br>
<br>
Item was added:<br>
+ ----- Method: GdbARMAlien&gt;&gt;pc (in category &#39;accessing&#39;) -----<br>
+ pc<br>
+       ^self unsignedLongAt: 73!<br>
<br>
Item was added:<br>
+ ----- Method: GdbARMAlien&gt;&gt;pc: (in category &#39;accessing&#39;) -----<br>
+ pc: anUnsignedInteger<br>
+<br>
+       ^self unsignedLongAt: 73 put: anUnsignedInteger!<br>
<br>
Item was added:<br>
+ ----- Method: GdbARMAlien&gt;&gt;primitiveDisassembleAt:inMemory: (in category &#39;primitives&#39;) -----<br>
+ primitiveDisassembleAt: address inMemory: memoryArray &quot;&lt;Bitmap|ByteArray&gt;&quot;<br>
+       &quot;Answer an Array of the size and the disassembled code string for the instruction at the current instruction pointer in memory.&quot;<br>
+       &lt;primitive: &#39;primitiveDisassembleAtInMemory&#39; module: &#39;GdbARMPlugin&#39;&gt;<br>
+       ^self primitiveFailed!<br>
<br>
Item was added:<br>
+ ----- Method: GdbARMAlien&gt;&gt;primitiveErrorAndLog (in category &#39;primitives&#39;) -----<br>
+ primitiveErrorAndLog<br>
+       &quot;Answer an array of the current error code and log contents&quot;<br>
+       &lt;primitive: &#39;primitiveErrorAndLog&#39; module: &#39;GdbARMPlugin&#39;&gt;<br>
+       ^self primitiveFailed!<br>
<br>
Item was added:<br>
+ ----- Method: GdbARMAlien&gt;&gt;primitiveResetCPU (in category &#39;primitives&#39;) -----<br>
+ primitiveResetCPU<br>
+       &quot;Reset the receiver to registers all zero, and protected 32-bit mode.&quot;<br>
+       &lt;primitive: &#39;primitiveResetCPU&#39; module: &#39;GdbARMPlugin&#39;&gt;<br>
+       ^self reportPrimitiveFailure!<br>
<br>
Item was added:<br>
+ ----- Method: GdbARMAlien&gt;&gt;primitiveRunInMemory:minimumAddress:readOnlyBelow: (in category &#39;primitives&#39;) -----<br>
+ primitiveRunInMemory: memoryArray &quot;&lt;Bitmap|ByteArray&gt;&quot; minimumAddress: minimumAddress &quot;&lt;Integer&gt;&quot; readOnlyBelow: minimumWritableAddress &quot;&lt;Integer&gt;&quot;<br>
+       &quot;Run the receiver using the argument as the store.  Origin the argument at 0. i.e. the first byte of the<br>
+        memoryArray is address 0.  Make addresses below minimumAddress illegal.  Convert out-of-range<br>
+        call, jump and memory read/writes into register instructions into ProcessorSimulationTrap signals.&quot;<br>
+       &lt;primitive: &#39;primitiveRunInMemoryMinimumAddressReadWrite&#39; module: &#39;GdbARMPlugin&#39; error: ec&gt;<br>
+       ^ec == #&#39;inappropriate operation&#39;<br>
+               ifTrue: [self handleExecutionPrimitiveFailureIn: memoryArray<br>
+                                       minimumAddress: minimumAddress<br>
+                                       readOnlyBelow: minimumWritableAddress]<br>
+               ifFalse: [self reportPrimitiveFailure]<br>
+<br>
+       &quot;self printRegistersOn: Transcript&quot;!<br>
<br>
Item was added:<br>
+ ----- Method: GdbARMAlien&gt;&gt;primitiveSingleStepInMemory:minimumAddress:readOnlyBelow: (in category &#39;primitives&#39;) -----<br>
+ primitiveSingleStepInMemory: memoryArray &quot;&lt;Bitmap|ByteArray&gt;&quot; minimumAddress: minimumAddress &quot;&lt;Integer&gt;&quot; readOnlyBelow: minimumWritableAddress &quot;&lt;Integer&gt;&quot;<br>
+       &quot;Single-step the receiver using the argument as the store.  Origin the argument at 0. i.e. the first byte of the<br>
+        memoryArray is address 0.  Make addresses below minimumAddress illegal.  Convert out-of-range<br>
+        call, jump and memory read/writes into register instructions into ProcessorSimulationTrap signals.&quot;<br>
+       &lt;primitive: &#39;primitiveSingleStepInMemoryMinimumAddressReadWrite&#39; module: &#39;GdbARMPlugin&#39; error: ec&gt;<br>
+       ^ec == #&#39;inappropriate operation&#39;<br>
+               ifTrue: [self handleExecutionPrimitiveFailureIn: memoryArray<br>
+                                       minimumAddress: minimumAddress<br>
+                                       readOnlyBelow: minimumWritableAddress]<br>
+               ifFalse: [self reportPrimitiveFailure]!<br>
<br>
Item was added:<br>
+ ----- Method: GdbARMAlien&gt;&gt;printRegisterState:on: (in category &#39;printing&#39;) -----<br>
+ printRegisterState: registerStateVector on: aStream<br>
+       | rsvs fields|<br>
+       aStream ensureCr.<br>
+       rsvs := registerStateVector readStream.<br>
+       fields := #(    r0 r1 r2 r3 r4 r5 r6 cr r7 r8 r9 r10 r11 r12 cr sp lr pc eflags cr).<br>
+       fields withIndexDo:<br>
+               [:sym :index| | val |<br>
+               sym = #cr<br>
+                       ifTrue: [aStream cr]<br>
+                       ifFalse:<br>
+                               [(val := rsvs next) isNil ifTrue: [^self].<br>
+                               aStream nextPutAll: sym; nextPut: $:; space.<br>
+                               val printOn: aStream base: 16 length: 8 padded: true.<br>
+                               #eflags == sym<br>
+                                       ifTrue:<br>
+                                               [aStream space.<br>
+                                                &quot;&#39;FIVCZN&#39;&quot;&#39;--VCZN&#39; withIndexDo:<br>
+                                                       [:flag :bitIndex|<br>
+                                                       flag ~= $- ifTrue:<br>
+                                                               [aStream nextPut: flag; nextPutAll: &#39;F=&#39;; print: (val bitAnd: 1 &lt;&lt; (bitIndex - 1)) &gt;&gt; (bitIndex - 1); space]]]<br>
+                                       ifFalse:<br>
+                                               [val &gt; 16 ifTrue:<br>
+                                                       [aStream space; nextPut: $(.<br>
+                                                        val printOn: aStream base: 10 length: 1 padded: false.<br>
+                                                        aStream nextPut: $)]].<br>
+                               (fields at: index + 1) ~~ #cr ifTrue:<br>
+                                       [aStream tab]]]!<br>
<br>
Item was added:<br>
+ ----- Method: GdbARMAlien&gt;&gt;r0 (in category &#39;accessing&#39;) -----<br>
+ r0<br>
+       ^self unsignedLongAt: 13!<br>
<br>
Item was added:<br>
+ ----- Method: GdbARMAlien&gt;&gt;r0: (in category &#39;accessing&#39;) -----<br>
+ r0: anUnsignedInteger<br>
+<br>
+       ^self unsignedLongAt: 13 put: anUnsignedInteger!<br>
<br>
Item was added:<br>
+ ----- Method: GdbARMAlien&gt;&gt;r1 (in category &#39;accessing&#39;) -----<br>
+ r1<br>
+       ^self unsignedLongAt: 17!<br>
<br>
Item was added:<br>
+ ----- Method: GdbARMAlien&gt;&gt;r10 (in category &#39;accessing&#39;) -----<br>
+ r10<br>
+       ^self unsignedLongAt: 53!<br>
<br>
Item was added:<br>
+ ----- Method: GdbARMAlien&gt;&gt;r10: (in category &#39;accessing&#39;) -----<br>
+ r10: anUnsignedInteger<br>
+<br>
+       ^self unsignedLongAt: 53 put: anUnsignedInteger!<br>
<br>
Item was added:<br>
+ ----- Method: GdbARMAlien&gt;&gt;r11 (in category &#39;accessing&#39;) -----<br>
+ r11<br>
+       ^self unsignedLongAt: 57!<br>
<br>
Item was added:<br>
+ ----- Method: GdbARMAlien&gt;&gt;r11: (in category &#39;accessing&#39;) -----<br>
+ r11: anUnsignedInteger<br>
+<br>
+       ^self unsignedLongAt: 57 put: anUnsignedInteger!<br>
<br>
Item was added:<br>
+ ----- Method: GdbARMAlien&gt;&gt;r12 (in category &#39;accessing&#39;) -----<br>
+ r12<br>
+       ^self unsignedLongAt: 61!<br>
<br>
Item was added:<br>
+ ----- Method: GdbARMAlien&gt;&gt;r12: (in category &#39;accessing&#39;) -----<br>
+ r12: anUnsignedInteger<br>
+<br>
+       ^self unsignedLongAt: 61 put: anUnsignedInteger!<br>
<br>
Item was added:<br>
+ ----- Method: GdbARMAlien&gt;&gt;r1: (in category &#39;accessing&#39;) -----<br>
+ r1: anUnsignedInteger<br>
+<br>
+       ^self unsignedLongAt: 17 put: anUnsignedInteger!<br>
<br>
Item was added:<br>
+ ----- Method: GdbARMAlien&gt;&gt;r2 (in category &#39;accessing&#39;) -----<br>
+ r2<br>
+       ^self unsignedLongAt: 21!<br>
<br>
Item was added:<br>
+ ----- Method: GdbARMAlien&gt;&gt;r2: (in category &#39;accessing&#39;) -----<br>
+ r2: anUnsignedInteger<br>
+<br>
+       ^self unsignedLongAt: 21 put: anUnsignedInteger!<br>
<br>
Item was added:<br>
+ ----- Method: GdbARMAlien&gt;&gt;r3 (in category &#39;accessing&#39;) -----<br>
+ r3<br>
+       ^self unsignedLongAt: 25!<br>
<br>
Item was added:<br>
+ ----- Method: GdbARMAlien&gt;&gt;r3: (in category &#39;accessing&#39;) -----<br>
+ r3: anUnsignedInteger<br>
+<br>
+       ^self unsignedLongAt: 25 put: anUnsignedInteger!<br>
<br>
Item was added:<br>
+ ----- Method: GdbARMAlien&gt;&gt;r4 (in category &#39;accessing&#39;) -----<br>
+ r4<br>
+       ^self unsignedLongAt: 29!<br>
<br>
Item was added:<br>
+ ----- Method: GdbARMAlien&gt;&gt;r4: (in category &#39;accessing&#39;) -----<br>
+ r4: anUnsignedInteger<br>
+<br>
+       ^self unsignedLongAt: 29 put: anUnsignedInteger!<br>
<br>
Item was added:<br>
+ ----- Method: GdbARMAlien&gt;&gt;r5 (in category &#39;accessing&#39;) -----<br>
+ r5<br>
+       ^self unsignedLongAt: 33!<br>
<br>
Item was added:<br>
+ ----- Method: GdbARMAlien&gt;&gt;r5: (in category &#39;accessing&#39;) -----<br>
+ r5: anUnsignedInteger<br>
+<br>
+       ^self unsignedLongAt: 33 put: anUnsignedInteger!<br>
<br>
Item was added:<br>
+ ----- Method: GdbARMAlien&gt;&gt;r6 (in category &#39;accessing&#39;) -----<br>
+ r6<br>
+       ^self unsignedLongAt: 37!<br>
<br>
Item was added:<br>
+ ----- Method: GdbARMAlien&gt;&gt;r6: (in category &#39;accessing&#39;) -----<br>
+ r6: anUnsignedInteger<br>
+<br>
+       ^self unsignedLongAt: 37 put: anUnsignedInteger!<br>
<br>
Item was added:<br>
+ ----- Method: GdbARMAlien&gt;&gt;r7 (in category &#39;accessing&#39;) -----<br>
+ r7<br>
+       ^self unsignedLongAt: 41!<br>
<br>
Item was added:<br>
+ ----- Method: GdbARMAlien&gt;&gt;r7: (in category &#39;accessing&#39;) -----<br>
+ r7: anUnsignedInteger<br>
+<br>
+       ^self unsignedLongAt: 41 put: anUnsignedInteger!<br>
<br>
Item was added:<br>
+ ----- Method: GdbARMAlien&gt;&gt;r8 (in category &#39;accessing&#39;) -----<br>
+ r8<br>
+       ^self unsignedLongAt: 45!<br>
<br>
Item was added:<br>
+ ----- Method: GdbARMAlien&gt;&gt;r8: (in category &#39;accessing&#39;) -----<br>
+ r8: anUnsignedInteger<br>
+<br>
+       ^self unsignedLongAt: 45 put: anUnsignedInteger!<br>
<br>
Item was added:<br>
+ ----- Method: GdbARMAlien&gt;&gt;r9 (in category &#39;accessing&#39;) -----<br>
+ r9<br>
+       ^self unsignedLongAt: 49!<br>
<br>
Item was added:<br>
+ ----- Method: GdbARMAlien&gt;&gt;r9: (in category &#39;accessing&#39;) -----<br>
+ r9: anUnsignedInteger<br>
+<br>
+       ^self unsignedLongAt: 49 put: anUnsignedInteger!<br>
<br>
Item was added:<br>
+ ----- Method: GdbARMAlien&gt;&gt;registerState (in category &#39;accessing-abstract&#39;) -----<br>
+ registerState<br>
+       ^{      self r0. self r1. self r2. self r3. self r4. self r5. self r6. self r7.<br>
+               self r8. self r0. self r10. self r11. self r12. self sp. self lr. self pc. self eflags }!<br>
<br>
Item was added:<br>
+ ----- Method: GdbARMAlien&gt;&gt;reset (in category &#39;accessing&#39;) -----<br>
+ reset<br>
+       self primitiveResetCPU!<br>
<br>
Item was added:<br>
+ ----- Method: GdbARMAlien&gt;&gt;retOpcode (in category &#39;opcodes&#39;) -----<br>
+ retOpcode<br>
+       &quot;the ret command does not generally exist. the most similar would be mov pc, lr&quot;<br>
+       ^ self halt.!<br>
<br>
Item was added:<br>
+ ----- Method: GdbARMAlien&gt;&gt;sflag (in category &#39;accessing&#39;) -----<br>
+ sflag<br>
+       ^self unsignedLongAt: 589!<br>
<br>
Item was added:<br>
+ ----- Method: GdbARMAlien&gt;&gt;sp (in category &#39;accessing&#39;) -----<br>
+ sp<br>
+       ^self unsignedLongAt: 65!<br>
<br>
Item was added:<br>
+ ----- Method: GdbARMAlien&gt;&gt;sp: (in category &#39;accessing&#39;) -----<br>
+ sp: anUnsignedInteger<br>
+<br>
+       ^self unsignedLongAt: 65 put: anUnsignedInteger!<br>
<br>
Item was added:<br>
+ ----- Method: GdbARMAlien&gt;&gt;vflag (in category &#39;accessing&#39;) -----<br>
+ vflag<br>
+       ^self unsignedLongAt: 581!<br>
<br>
Item was added:<br>
+ ----- Method: GdbARMAlien&gt;&gt;zflag (in category &#39;accessing&#39;) -----<br>
+ zflag<br>
+       ^self unsignedLongAt: 573!<br>
<br>
Item was added:<br>
+ TestCase subclass: #GdbARMAlienTests<br>
+       instanceVariableNames: &#39;processor&#39;<br>
+       classVariableNames: &#39;&#39;<br>
+       poolDictionaries: &#39;&#39;<br>
+       category: &#39;Cog-Processors-Tests&#39;!<br>
<br>
Item was added:<br>
+ ----- Method: GdbARMAlienTests&gt;&gt;callTrapPerformance: (in category &#39;tests&#39;) -----<br>
+ callTrapPerformance: n<br>
+       &quot;Call a function that is out-of-range.  Ensure the call is trapped.&quot;<br>
+       &quot;self new testCallTrap&quot;<br>
+       | memory |<br>
+        &quot;The address is out of range of memory every which way (whether relative or absolute and whether big-endian or little.&quot;<br>
+       memory := ByteArray new: 1024.<br>
+       memory replaceFrom: 1 to: 5 with: { self processor callOpcode. 0. 16r80. 16r80. 0. } asByteArray.<br>
+       self processor<br>
+                       eip: 0;<br>
+                       esp: (memory size - 4). &quot;Room for return address&quot;<br>
+       1 to: n do:<br>
+               [:ign|<br>
+               [self processor singleStepIn: memory]<br>
+                       on: ProcessorSimulationTrap<br>
+                       do: [:ex|]].<br>
+<br>
+       &quot;QSystemProfiler spyOn: [GdbARMAlienTests new callTrapPerformance: 1024*128]&quot;<br>
+       &quot;Time millisecondsToRun: [GdbARMAlienTests new callTrapPerformance: 1024*128] 2463&quot;<br>
+       &quot;Time millisecondsToRun: [1 to: 1024*1024*64 do: [:ign| nil yourself]] 636&quot;<br>
+       &quot;Time millisecondsToRun: [1 to: 1024*1024*64 do: [:ign| nil perform: #ifNotNilDo: with: nil]] 3639&quot;<br>
+       &quot;Time millisecondsToRun: [1 to: 1024*1024*64 do: [:ign| nil perform: #ifNotNilDo:ifNil: with: nil with: nil]] 12401&quot;!<br>
<br>
Item was added:<br>
+ ----- Method: GdbARMAlienTests&gt;&gt;nfib (in category &#39;accessing&#39;) -----<br>
+ nfib<br>
+       &quot;long fib(long n) { return n &lt;= 1 ? 1 : fib(n-1) + fib(n-2) + 1; }<br>
+        as compiled by arm-elf-gnuabi-gcc fib.c -c -marm<br>
+       also, the jumps are changed by hand.&quot;<br>
+       &quot;| bat nfib ip |<br>
+       bat := GdbARMAlienTests new.<br>
+       nfib := bat nfib asWordArray.<br>
+       ip := 0.<br>
+       23 timesRepeat:<br>
+               [bat processor disassembleInstructionAt: ip In: nfib into:<br>
+                       [:da :len|<br>
+                       Transcript nextPutAll: da; cr; flush.<br>
+                       ip := ip + len]]&quot;<br>
+       ^#(&quot;00000000 &lt;fib&gt;:<br>
+          0:&quot;          16re92d4810             &quot;push   {r4, fp, lr}    fp = r11, sp is changed in this command<br>
+          4:&quot;          16re28db008             &quot;add    fp, sp, #8      now, the frame pointer is changed<br>
+          8:&quot;          16re24dd00c             &quot;sub    sp, sp, #12<br>
+          c:&quot;          16re50b0010             &quot;str    r0, [fp, #-16]<br>
+         10:&quot;          16re51b3010             &quot;ldr    r3, [fp, #-16]  r3 &lt;- [fp-16] &lt;- r0<br>
+         14:&quot;          16re3530001             &quot;cmp    r3, #1<br>
+         18:&quot;          16rda00000c             &quot;ble    50 &lt;fib+0x50&gt;<br>
+         1c:&quot;          16re51b3010             &quot;ldr    r3, [fp, #-16]<br>
+         20:&quot;          16re2433001             &quot;sub    r3, r3, #1<br>
+         24:&quot;          16re1a00003             &quot;mov    r0, r3<br>
+         28:&quot;          16rebfffff4             &quot;bl     0 &lt;fib&gt;<br>
+         2c:&quot;          16re1a04000             &quot;mov    r4, r0<br>
+         30:&quot;          16re51b3010             &quot;ldr    r3, [fp, #-16]<br>
+         34:&quot;          16re2433002             &quot;sub    r3, r3, #2<br>
+         38:&quot;          16re1a00003             &quot;mov    r0, r3<br>
+         3c:&quot;          16rebffffef             &quot;bl     0 &lt;fib&gt;<br>
+         40:&quot;          16re1a03000             &quot;mov    r3, r0<br>
+         44:&quot;          16re0843003             &quot;add    r3, r4, r3<br>
+         48:&quot;          16re2833001             &quot;add    r3, r3, #1<br>
+         4c:&quot;          16rea000000             &quot;b      54 &lt;fib+0x54&gt;<br>
+         50:&quot;          16re3a03001             &quot;mov    r3, #1<br>
+         54:&quot;          16re1a00003             &quot;mov    r0, r3<br>
+         58:&quot;          16re24bd008             &quot;sub    sp, fp, #8<br>
+         5c:&quot;          16re8bd8810             &quot;pop    {r4, fp, pc}&quot;)!<br>
<br>
Item was added:<br>
+ ----- Method: GdbARMAlienTests&gt;&gt;processor (in category &#39;accessing&#39;) -----<br>
+ processor<br>
+       processor ifNil:<br>
+               [processor := GdbARMAlien new].<br>
+       ^processor!<br>
<br>
Item was added:<br>
+ ----- Method: GdbARMAlienTests&gt;&gt;registerGetters (in category &#39;accessing&#39;) -----<br>
+ registerGetters<br>
+       ^#(r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 lr sp pc)!<br>
<br>
Item was added:<br>
+ ----- Method: GdbARMAlienTests&gt;&gt;registerSetters (in category &#39;accessing&#39;) -----<br>
+ registerSetters<br>
+       ^#(r0: r1: r2: r3: r4: r5: r6: r7: r8: r9: r10: r11: r12: lr: sp: pc:)!<br>
<br>
Item was added:<br>
+ ----- Method: GdbARMAlienTests&gt;&gt;runNFib:disassemble:printRegisters: (in category &#39;execution&#39;) -----<br>
+ runNFib: n disassemble: disassemble printRegisters: printRegisters<br>
+       &quot;Run nfib wth the argument. Answer the result.&quot;<br>
+       &quot;self new runNFib: 5 disassemble: true printRegisters: true&quot;<br>
+       | memory |<br>
+       memory := WordArray new: 1024 * 2 withAll: self processor nopOpcode.<br>
+       memory replaceFrom: 1 to: self nfib size with: self nfib asWordArray startingAt: 1.<br>
+       self processor<br>
+               r0: n;&quot;argument n&quot;<br>
+               lr: memory size * 2; &quot;return address&quot;<br>
+               pc: 0;<br>
+               sp: (memory size * 4) - 16.<br>
+       printRegisters ifTrue:<br>
+               [self processor printRegistersOn: Transcript.<br>
+                Transcript cr; flush].<br>
+       &quot;run until something goes wrong.&quot;<br>
+       self processor runInMemory: memory readExecuteOnlyBelow: memory size / 2.<br>
+       printRegisters ifTrue:<br>
+               [self processor printRegistersOn: Transcript.<br>
+                Transcript cr; flush].<br>
+       ^self processor r0!<br>
<br>
Item was added:<br>
+ ----- Method: GdbARMAlienTests&gt;&gt;singleStepNFib:disassemble:printRegisters: (in category &#39;execution&#39;) -----<br>
+ singleStepNFib: n disassemble: disassemble printRegisters: printRegisters<br>
+       &quot;Run nfib wth the argument. Answer the result.&quot;<br>
+       &quot;self new runNFib: 5 disassemble: true printRegisters: true&quot;<br>
+       | memory |<br>
+       memory := WordArray new: 1024 * 2 withAll: self processor nopOpcode.<br>
+       memory replaceFrom: 1 to: self nfib size with: self nfib asWordArray startingAt: 1.<br>
+       self processor<br>
+               r0: n; &quot;argument n&quot;<br>
+               lr: self nfib size * 4;  &quot;return address&quot;<br>
+               pc: 0;<br>
+               sp: (memory size * 4 - 12). &quot;Room for return address, frame pointer and r4&quot;<br>
+       printRegisters ifTrue:<br>
+               [self processor printRegistersOn: Transcript.<br>
+                Transcript cr; flush].<br>
+       [disassemble ifTrue:<br>
+               [Transcript nextPutAll: (self processor disassembleNextInstructionIn: memory); cr; flush].<br>
+        self processor singleStepIn: memory readExecuteOnlyBelow: memory size * 4 / 2.<br>
+        printRegisters ifTrue:<br>
+               [self processor printRegistersOn: Transcript.<br>
+                Transcript cr; flush].<br>
+       &quot;stop, once we leave the nfib code and step through the nops after that.&quot;<br>
+        self processor pc &lt; (self nfib size * 4)] whileTrue.<br>
+       ^self processor r0!<br>
<br>
Item was added:<br>
+ ----- Method: GdbARMAlienTests&gt;&gt;testCallTrap (in category &#39;tests&#39;) -----<br>
+ testCallTrap<br>
+       &quot;Call a function that is out-of-range.  Ensure the call is trapped.&quot;<br>
+       &quot;self new testCallTrap&quot;<br>
+       | memory |<br>
+       memory := Bitmap new: 256 withAll: self processor nopOpcode.<br>
+       memory longAt: 1 put: (self processor branchAndLinkOpcodeWithOffset: 1024) bigEndian: false.<br>
+       memory := memory asByteArray.<br>
+       self processor<br>
+                       pc: 0;<br>
+                       sp: (memory size - 4); &quot;Room for return address&quot;<br>
+                       singleStepIn: memory.<br>
+                       &quot;We have to step twice, because the first step only changes the pc, but does not fetch anything from the address it points to.&quot;<br>
+       self should: [self processor singleStepIn: memory]<br>
+               raise: Error<br>
+               withExceptionDo:<br>
+                       [:pst|<br>
+                       self assert: self processor pc = 1024.<br>
+                       self assert: self processor lr = 4.<br>
+                       self assert: pst messageText = &#39;Error 0: Illegal Instruction fetch address (0x00000400).&#39;].!<br>
<br>
Item was added:<br>
+ ----- Method: GdbARMAlienTests&gt;&gt;testDisassembling (in category &#39;tests&#39;) -----<br>
+ testDisassembling<br>
+<br>
+       | memory result |<br>
+       memory := WordArray new: 2.<br>
+       memory at: 1 put: 16rEF200000.<br>
+       result := self processor<br>
+               disassembleInstructionAt: 0<br>
+               In: memory<br>
+               into: [:str :len |<br>
+                       self<br>
+                               assert: len = 4;<br>
+                               assert: str = &#39;svc      0x00200000&#39;].!<br>
<br>
Item was added:<br>
+ ----- Method: GdbARMAlienTests&gt;&gt;testExecutionTrap (in category &#39;tests&#39;) -----<br>
+ testExecutionTrap<br>
+       &quot;Execute a run of nops.  test executing beyond the executable limit is trapped.&quot;<br>
+       &quot;self new testExecutionTrap&quot;<br>
+       | memory |<br>
+        &quot;The address is out of range of memory every which way (whether relative or absolute and whether big-endian or little.&quot;<br>
+       memory := (Bitmap new: 1024 * 2 withAll: self processor nopOpcode) asByteArray.<br>
+       self processor<br>
+                       pc: 0;<br>
+                       sp: (memory size - 4). &quot;Room for return address&quot;<br>
+       self should: [self processor runInMemory: memory minimumAddress: 0 readOnlyBelow: memory size / 2]<br>
+               raise: Error<br>
+               withExceptionDo:<br>
+                       [:err|<br>
+                       self assert: self processor pc = (memory size / 2).<br>
+                       self assert: (&#39;Error 0: Illegal Instruction fetch address (0x00001000).&#39; match: err messageText)].<br>
+       self processor pc: 0.<br>
+       self should: [[self processor singleStepIn: memory minimumAddress: 0 readOnlyBelow: memory size / 2] repeat]<br>
+               raise: Error<br>
+               withExceptionDo:<br>
+                       [:err|<br>
+                       self assert: self processor pc = (memory size / 2).<br>
+                       self assert: (&#39;Error 0: Illegal Instruction fetch address (0x00001000).&#39; match: err messageText)]!<br>
<br>
Item was added:<br>
+ ----- Method: GdbARMAlienTests&gt;&gt;testFlags (in category &#39;tests&#39;) -----<br>
+ testFlags<br>
+       &quot;self new testFlags&quot;<br>
+       | memory |<br>
+       memory := Bitmap new: 3.<br>
+       memory longAt: 1 put: 16rE3A03001 bigEndian: false. &quot;MOV r3, #1&quot;<br>
+       memory longAt: 5 put: 16rE3530001 bigEndian: false. &quot;CMP r3, #1&quot;<br>
+       memory := memory asByteArray.<br>
+       self processor<br>
+               disassembleInstructionAt: 0<br>
+               In: memory<br>
+               into: [:str :len |<br>
+                       self<br>
+                               assert: len = 4;<br>
+                               assert: str = &#39;mov      r3, #1&#39;].<br>
+       self processor<br>
+               disassembleInstructionAt: 4<br>
+               In: memory<br>
+               into: [:str :len |<br>
+                       self<br>
+                               assert: len = 4;<br>
+                               assert: str = &#39;cmp      r3, #1&#39;].<br>
+       self processor<br>
+               pc: 0;<br>
+               singleStepIn: memory;<br>
+               singleStepIn: memory.<br>
+       self<br>
+               assert: self processor pc = 16r8;<br>
+               assert: self processor r3 = 1;<br>
+               assert: self processor zflag = 1;<br>
+               assert: self processor cflag = 1;<br>
+               assert: self processor vflag = 0;<br>
+               assert: self processor nflag = 0.<br>
+       self processor reset.<br>
+       self assert: self processor eflags = 3. &quot;IFFlags are both set.&quot;!<br>
<br>
Item was added:<br>
+ ----- Method: GdbARMAlienTests&gt;&gt;testMOVSD (in category &#39;tests&#39;) -----<br>
+ testMOVSD<br>
+       &quot;Test MOVSD indirecting through edx.&quot;<br>
+       &quot;self new testMOVSD&quot;<br>
+       self processor<br>
+               edx: 0;<br>
+               eip: 0;<br>
+               singleStepIn: {16rF2. 16r0F. 16r10. 16r42. 16r04. 16r90. 16r01. 16r02. 16r03. 16r04. 16r05. 16r06} asByteArray &quot;movsd %ds:0x4(%edx), %xmm0;nop;garbage&quot;.<br>
+       self assert: self processor eip = 5.<br>
+       self assert: self processor xmm0low = 16r0605040302019004!<br>
<br>
Item was added:<br>
+ ----- Method: GdbARMAlienTests&gt;&gt;testNfib1 (in category &#39;tests&#39;) -----<br>
+ testNfib1<br>
+       &quot;self new testNfib1&quot;<br>
+       self should: [self runNFib: 1 disassemble: false printRegisters: true]<br>
+               raise: Error<br>
+               withExceptionDo:<br>
+                       [:err| self assert: err messageText = &#39;Error 0: Illegal Instruction fetch address (0x00001000).&#39;].<br>
+       self deny: (self processor pc between: 0 and: self nfib size).<br>
+       self assert: self processor r0 = 1 benchFib!<br>
<br>
Item was added:<br>
+ ----- Method: GdbARMAlienTests&gt;&gt;testNfib16 (in category &#39;tests&#39;) -----<br>
+ testNfib16<br>
+       &quot;self new testNfib16&quot;<br>
+       self should: [self runNFib: 16 disassemble: false printRegisters: false]<br>
+               raise: Error.<br>
+       self deny: (self processor pc between: 0 and: self nfib size).<br>
+       self assert: self processor r0 = 16 benchFib!<br>
<br>
Item was added:<br>
+ ----- Method: GdbARMAlienTests&gt;&gt;testNfib2 (in category &#39;tests&#39;) -----<br>
+ testNfib2<br>
+       &quot;self new testNfib2&quot;<br>
+       self should: [self runNFib: 2 disassemble: false printRegisters: false]<br>
+               raise: Error.<br>
+       self deny: (self processor pc between: 0 and: self nfib size).<br>
+       self assert: self processor r0 = 2 benchFib!<br>
<br>
Item was added:<br>
+ ----- Method: GdbARMAlienTests&gt;&gt;testNfib4 (in category &#39;tests&#39;) -----<br>
+ testNfib4<br>
+       &quot;self new testNfib4&quot;<br>
+       self should: [self runNFib: 4 disassemble: false printRegisters: false]<br>
+               raise: Error.<br>
+       self deny: (self processor pc between: 0 and: self nfib size).<br>
+       self assert: self processor r0 = 4 benchFib!<br>
<br>
Item was added:<br>
+ ----- Method: GdbARMAlienTests&gt;&gt;testResetCPU (in category &#39;tests&#39;) -----<br>
+ testResetCPU<br>
+       &quot;self new testResetCPU&quot;<br>
+       self registerSetters do:<br>
+               [:setter|<br>
+               self processor perform: setter with: 16r55555555].<br>
+       self registerGetters do:<br>
+               [:getter|<br>
+               self assert: 16r55555555 = (self processor perform: getter)].<br>
+       self processor reset.<br>
+       self registerGetters do:<br>
+               [:getter|<br>
+               self assert: 0 = (self processor perform: getter)]!<br>
<br>
Item was added:<br>
+ ----- Method: GdbARMAlienTests&gt;&gt;testStepNfib1 (in category &#39;tests&#39;) -----<br>
+ testStepNfib1<br>
+       &quot;self new testStepNfib1&quot;<br>
+       self singleStepNFib: 1 disassemble: false printRegisters: false.<br>
+       self assert: self processor pc = (self nfib asWordArray size * 4).<br>
+       self assert: self processor r0 = 1 benchFib!<br>
<br>
Item was added:<br>
+ ----- Method: GdbARMAlienTests&gt;&gt;testStepNfib2 (in category &#39;tests&#39;) -----<br>
+ testStepNfib2<br>
+       &quot;self new testStepNfib2&quot;<br>
+       self singleStepNFib: 2 disassemble: false printRegisters: false.<br>
+       self assert: self processor pc = (self nfib size * 4).<br>
+       self assert: self processor r0 = 2 benchFib!<br>
<br>
Item was added:<br>
+ ----- Method: GdbARMAlienTests&gt;&gt;testStepNfib4 (in category &#39;tests&#39;) -----<br>
+ testStepNfib4<br>
+       &quot;self new testStepNfib4&quot;<br>
+       self singleStepNFib: 4 disassemble: false printRegisters: false.<br>
+       self assert: self processor pc = (self nfib size * 4).<br>
+       self assert: self processor r0 = 4 benchFib!<br>
<br>
Item was added:<br>
+ SmartSyntaxInterpreterPlugin subclass: #GdbARMPlugin<br>
+       instanceVariableNames: &#39;prevInterruptCheckChain&#39;<br>
+       classVariableNames: &#39;&#39;<br>
+       poolDictionaries: &#39;VMBasicConstants&#39;<br>
+       category: &#39;Cog-ProcessorPlugins&#39;!<br>
+<br>
+ !GdbARMPlugin commentStamp: &#39;&lt;historical&gt;&#39; prior: 0!<br>
+ I provide access to the ARMulator ARM emulator and the libopcodes ARM disassembler.!<br>
<br>
Item was added:<br>
+ ----- Method: GdbARMPlugin class&gt;&gt;declareCVarsIn: (in category &#39;translation&#39;) -----<br>
+ declareCVarsIn: aCCodeGenerator<br>
+       &quot;prevInterruptCheckChain lives in sqGdbARMPlugin.c&quot;<br>
+       super declareCVarsIn: aCCodeGenerator.<br>
+       aCCodeGenerator removeVariable: &#39;prevInterruptCheckChain&#39;!<br>
<br>
Item was added:<br>
+ ----- Method: GdbARMPlugin class&gt;&gt;hasHeaderFile (in category &#39;translation&#39;) -----<br>
+ hasHeaderFile<br>
+       &quot;We need a header to declare newcpu and pull in bochs.h &amp; cpu.h&quot;<br>
+       ^true!<br>
<br>
Item was added:<br>
+ ----- Method: GdbARMPlugin&gt;&gt;forceStopOnInterrupt (in category &#39;interruption&#39;) -----<br>
+ forceStopOnInterrupt<br>
+       interpreterProxy getInterruptPending ifTrue:<br>
+               [self forceStopRunning]!<br>
<br>
Item was added:<br>
+ ----- Method: GdbARMPlugin&gt;&gt;primitiveDisassembleAt:InMemory: (in category &#39;primitives&#39;) -----<br>
+ &quot;cpuAlien &lt;GdbARMAlien&gt;&quot; primitiveDisassembleAt: address &quot;&lt;Integer&gt;&quot; InMemory: memory &quot;&lt;Bitmap|ByteArray|WordArray&gt;&quot;<br>
+       &quot;Return an Array of the instruction length and its decompilation as a string for the instruction at address in memory.&quot;<br>
+       | cpuAlien cpu instrLenOrErr resultObj log logLen logObj logObjData |<br>
+       &lt;var: #cpu type: #&#39;void *&#39;&gt;<br>
+       cpuAlien := self primitive: #primitiveDisassembleAtInMemory<br>
+                                       parameters: #(Unsigned WordsOrBytes)<br>
+                                       receiver: #Oop.<br>
+       (cpu := self startOfData: cpuAlien) = 0 ifTrue:<br>
+               [^interpreterProxy primitiveFailFor: PrimErrBadReceiver].<br>
+       instrLenOrErr := self disassembleFor: cpu<br>
+                                               At: address<br>
+                                               In: memory<br>
+                                               Size: (interpreterProxy byteSizeOf: memory cPtrAsOop).<br>
+       instrLenOrErr &lt; 0 ifTrue:<br>
+               [^interpreterProxy primitiveFailFor: PrimErrInappropriate].<br>
+       log := self getlog: (self cCode: [self addressOf: logLen] inSmalltalk: [logLen := 0]).<br>
+       resultObj := interpreterProxy instantiateClass: interpreterProxy classArray indexableSize: 2.<br>
+       resultObj = 0 ifTrue:<br>
+               [^interpreterProxy primitiveFailFor: PrimErrNoMemory].<br>
+<br>
+       &quot;Easier keeping the damn thing on the stack than using pushRemappableOop:/popRemappableOop.<br>
+        Where is topRemappableOop when you need it?&quot;<br>
+       interpreterProxy pushRemappableOop: resultObj.<br>
+       logObj := interpreterProxy<br>
+                               instantiateClass: interpreterProxy classString<br>
+                               indexableSize: logLen.<br>
+       interpreterProxy failed ifTrue:<br>
+               [interpreterProxy popRemappableOop.<br>
+                ^interpreterProxy primitiveFailFor: PrimErrNoMemory].<br>
+       logObjData := interpreterProxy arrayValueOf: logObj.<br>
+       self cCode: &#39;memcpy(logObjData, log, logLen)&#39; inSmalltalk: [logObjData. log].<br>
+       resultObj := interpreterProxy popRemappableOop.<br>
+       interpreterProxy<br>
+               storePointer: 0<br>
+               ofObject: resultObj<br>
+               withValue: (interpreterProxy integerObjectOf: instrLenOrErr).<br>
+       interpreterProxy storePointer: 1 ofObject: resultObj withValue: logObj.<br>
+<br>
+       ^resultObj!<br>
<br>
Item was added:<br>
+ ----- Method: GdbARMPlugin&gt;&gt;primitiveErrorAndLog (in category &#39;primitives&#39;) -----<br>
+ primitiveErrorAndLog<br>
+       | log logLen resultObj logObj logObjData |<br>
+       &lt;var: #log type: #&#39;char *&#39;&gt;<br>
+       &lt;var: #logObjData type: #&#39;char *&#39;&gt;<br>
+       self primitive: #primitiveErrorAndLog parameters: #().<br>
+<br>
+       log := self getlog: (self cCode: [self addressOf: logLen] inSmalltalk: [logLen := 0]).<br>
+       resultObj := interpreterProxy instantiateClass: interpreterProxy classArray indexableSize: 2.<br>
+       resultObj = 0 ifTrue:<br>
+               [^interpreterProxy primitiveFailFor: PrimErrNoMemory].<br>
+<br>
+       interpreterProxy<br>
+               storePointer: 0<br>
+               ofObject: resultObj<br>
+               withValue: (interpreterProxy integerObjectOf: self errorAcorn).<br>
+<br>
+       logLen &gt; 0 ifTrue:<br>
+               [interpreterProxy pushRemappableOop: resultObj.<br>
+               logObj := interpreterProxy<br>
+                                       instantiateClass: interpreterProxy classString<br>
+                                       indexableSize: logLen.<br>
+               interpreterProxy failed ifTrue:<br>
+                       [interpreterProxy popRemappableOop.<br>
+                        ^interpreterProxy primitiveFailFor: PrimErrNoMemory].<br>
+<br>
+               resultObj := interpreterProxy popRemappableOop.<br>
+               logObjData := interpreterProxy arrayValueOf: logObj.<br>
+               self cCode: &#39;memcpy(logObjData, log, logLen)&#39; inSmalltalk: [logObjData. log].<br>
+               interpreterProxy storePointer: 1 ofObject: resultObj withValue: logObj].<br>
+       interpreterProxy pop: 1 thenPush: resultObj!<br>
<br>
Item was added:<br>
+ ----- Method: GdbARMPlugin&gt;&gt;primitiveFlushICacheFrom:To: (in category &#39;primitives&#39;) -----<br>
+ &quot;cpuAlien &lt;GdbARMAlien&gt;&quot; primitiveFlushICacheFrom: startAddress &quot;&lt;Integer&gt;&quot; To: endAddress &quot;&lt;Integer&gt;&quot;<br>
+       &quot;Flush the icache in the requested range&quot;<br>
+       | cpuAlien cpu |<br>
+       &lt;var: #cpu type: &#39;void *&#39;&gt;<br>
+       cpuAlien := self primitive: #primitiveFlushICacheFromTo<br>
+                                       parameters: #(Unsigned Unsigned)<br>
+                                       receiver: #Oop.<br>
+       (cpu := self startOfData: cpuAlien) = 0 ifTrue:<br>
+               [^interpreterProxy primitiveFailFor: PrimErrBadReceiver].<br>
+       self flushICache: cpu From: startAddress To: endAddress!<br>
<br>
Item was added:<br>
+ ----- Method: GdbARMPlugin&gt;&gt;primitiveNewCPU (in category &#39;primitives&#39;) -----<br>
+ primitiveNewCPU<br>
+       | cpu |<br>
+       &lt;var: #cpu type: &#39;void *&#39;&gt;<br>
+       self primitive: #primitiveNewCPU parameters: #().<br>
+<br>
+       cpu := self cCode: &#39;newCPU()&#39; inSmalltalk: [0].<br>
+       cpu = 0 ifTrue:<br>
+               [^interpreterProxy primitiveFail].<br>
+       interpreterProxy<br>
+               pop: 1<br>
+               thenPush: (interpreterProxy positive32BitIntegerFor:<br>
+                                                                               (self cCoerceSimple: cpu<br>
+                                                                                       to: &#39;unsigned long&#39;))!<br>
<br>
Item was added:<br>
+ ----- Method: GdbARMPlugin&gt;&gt;primitiveResetCPU (in category &#39;primitives&#39;) -----<br>
+ primitiveResetCPU<br>
+       | cpuAlien cpu maybeErr |<br>
+       &lt;var: #cpu type: &#39;void *&#39;&gt;<br>
+       cpuAlien := self primitive: #primitiveResetCPU parameters: #() receiver: #Oop.<br>
+       (cpu := self startOfData: cpuAlien) = 0 ifTrue:<br>
+               [^interpreterProxy primitiveFailFor: PrimErrBadReceiver].<br>
+       maybeErr := self resetCPU: cpu.<br>
+       maybeErr ~= 0 ifTrue:<br>
+               [^interpreterProxy primitiveFailFor: PrimErrInappropriate].<br>
+       ^cpuAlien!<br>
<br>
Item was added:<br>
+ ----- Method: GdbARMPlugin&gt;&gt;primitiveRunInMemory:minimumAddress:readOnlyBelow: (in category &#39;primitives&#39;) -----<br>
+ &quot;cpuAlien &lt;GdbARMAlien&gt;&quot; primitiveRunInMemory: memory &quot;&lt;Bitmap|ByteArray|WordArray&gt;&quot; minimumAddress: minAddress &quot;&lt;Integer&gt;&quot; readOnlyBelow: minWriteMaxExecAddress &quot;&lt;Integer&gt;&quot;<br>

+       &quot;Run the cpu using the first argument as the memory and the following arguments defining valid addresses, running until it halts or hits an exception.&quot;<br>
+       | cpuAlien cpu maybeErr |<br>
+       &lt;var: #cpu type: #&#39;void *&#39;&gt;<br>
+       cpuAlien := self primitive: #primitiveRunInMemoryMinimumAddressReadWrite<br>
+                                       parameters: #(WordsOrBytes Unsigned Unsigned)<br>
+                                       receiver: #Oop.<br>
+       (cpu := self startOfData: cpuAlien) = 0 ifTrue:<br>
+               [^interpreterProxy primitiveFailFor: PrimErrBadReceiver].<br>
+       prevInterruptCheckChain := interpreterProxy setInterruptCheckChain: #forceStopOnInterrupt asSymbol.<br>
+       prevInterruptCheckChain = #forceStopOnInterrupt asSymbol ifTrue:<br>
+               [prevInterruptCheckChain = 0].<br>
+       maybeErr := self runCPU: cpu<br>
+                                       In: memory<br>
+                                       Size: (interpreterProxy byteSizeOf: memory cPtrAsOop)<br>
+                                       MinAddressRead: minAddress<br>
+                                       Write: minWriteMaxExecAddress.<br>
+       interpreterProxy setInterruptCheckChain: prevInterruptCheckChain.<br>
+       maybeErr ~= 0 ifTrue:<br>
+               [^interpreterProxy primitiveFailFor: PrimErrInappropriate].<br>
+       ^cpuAlien!<br>
<br>
Item was added:<br>
+ ----- Method: GdbARMPlugin&gt;&gt;primitiveSingleStepInMemory:minimumAddress:readOnlyBelow: (in category &#39;primitives&#39;) -----<br>
+ &quot;cpuAlien &lt;GdbARMAlien&gt;&quot; primitiveSingleStepInMemory: memory &quot;&lt;Bitmap|ByteArray|WordArray&gt;&quot; minimumAddress: minAddress &quot;&lt;Integer&gt;&quot;  readOnlyBelow: minWriteMaxExecAddress &quot;&lt;Integer&gt;&quot;<br>

+       &quot;Single-step the cpu using the first argument as the memory and the following arguments defining valid addresses.&quot;<br>
+       | cpuAlien cpu maybeErr |<br>
+       &lt;var: #cpu type: #&#39;void *&#39;&gt;<br>
+       cpuAlien := self primitive: #primitiveSingleStepInMemoryMinimumAddressReadWrite<br>
+                                       parameters: #(WordsOrBytes Unsigned Unsigned)<br>
+                                       receiver: #Oop.<br>
+       (cpu := self startOfData: cpuAlien) = 0 ifTrue:<br>
+               [^interpreterProxy primitiveFailFor: PrimErrBadReceiver].<br>
+       maybeErr := self singleStepCPU: cpu<br>
+                                       In: memory<br>
+                                       Size: (interpreterProxy byteSizeOf: memory cPtrAsOop)<br>
+                                       MinAddressRead: minAddress<br>
+                                       Write: minWriteMaxExecAddress.<br>
+       maybeErr ~= 0 ifTrue:<br>
+               [^interpreterProxy primitiveFailFor: PrimErrInappropriate].<br>
+       ^cpuAlien!<br>
<br>
Item was added:<br>
+ ----- Method: GdbARMPlugin&gt;&gt;sizeField: (in category &#39;alien support&#39;) -----<br>
+ sizeField: rcvr<br>
+       &quot;Answer the first field of rcvr which is assumed to be an Alien of at least 8 bytes&quot;<br>
+       &lt;inline: true&gt;<br>
+       ^self longAt: rcvr + BaseHeaderSize!<br>
<br>
Item was added:<br>
+ ----- Method: GdbARMPlugin&gt;&gt;startOfData: (in category &#39;alien support&#39;) -----<br>
+ startOfData: rcvr &quot;&lt;Alien oop&gt; ^&lt;Integer&gt;&quot;<br>
+       &quot;Answer the start of rcvr&#39;s data.  For direct aliens this is the address of<br>
+        the second field.  For indirect and pointer aliens it is what the second field points to.&quot;<br>
+       &lt;inline: true&gt;<br>
+       ^(self sizeField: rcvr) &gt; 0<br>
+               ifTrue: [rcvr + BaseHeaderSize + BytesPerOop]<br>
+               ifFalse: [self longAt: rcvr + BaseHeaderSize + BytesPerOop]!<br>
<br>
</blockquote></div><br><br clear="all"><div><br></div>-- <br>best,<div>Eliot</div><br>
</div>