From owner-java@jp.FreeBSD.org Fri Aug 30 15:28:08 2002
Received: (from daemon@localhost)
	by castle.jp.FreeBSD.org (8.11.6+3.4W/8.11.3) id g7U6S8S45642;
	Fri, 30 Aug 2002 15:28:08 +0900 (JST)
	(envelope-from owner-java@jp.FreeBSD.org)
Received: from mx1.aist.go.jp (mx1.aist.go.jp [150.29.246.133])
	by castle.jp.FreeBSD.org (8.11.6+3.4W/8.11.3) with ESMTP/inet id g7U6S8345637
	for <java@jp.FreeBSD.org>; Fri, 30 Aug 2002 15:28:08 +0900 (JST)
	(envelope-from shudo@computer.org)
Received: from rpsmtp1.aist.go.jp
	by mx1.aist.go.jp  with ESMTP id g7U6S7W19936
	for <java@jp.FreeBSD.org>; Fri, 30 Aug 2002 15:28:07 +0900 (JST)
	env-from (shudo@computer.org)
Received: from mail05.aist.go.jp
        by rpsmtp1.aist.go.jp  with ESMTP id g7U6S6O03979
        for <java@jp.FreeBSD.org>; Fri, 30 Aug 2002 15:28:06 +0900 (JST)
        env-from (shudo@computer.org)
Received: from aist.go.jp
        by mail05.aist.go.jp  with ESMTP id g7U6S5k28393
        for <java@jp.FreeBSD.org>; Fri, 30 Aug 2002 15:28:06 +0900 (JST)
        env-from (shudo@computer.org)
Message-Id: <20020830.152855.846933591.shudoh@localhost>
To: java@jp.FreeBSD.org
From: shudo@computer.org
In-Reply-To: <20020829131407.4f3c16ad.daichi@jp.freebsd.org>
References: <20020828113650.7bc6d4f7.daichi@jp.freebsd.org>
	<20020828.135007.730550306.shudoh@localhost>
	<20020829131407.4f3c16ad.daichi@jp.freebsd.org>
X-Mailer: Mew version 2.2 on XEmacs 21.4.8 (Honest Recruiter)
Mime-Version: 1.0
Content-Type: Multipart/Mixed;
 boundary="--Next_Part(Fri_Aug_30_15:28:55_2002_864)--"
Content-Transfer-Encoding: 7bit
Reply-To: java@jp.FreeBSD.org
Precedence: list
Date: Fri, 30 Aug 2002 15:28:55 +0900
X-Sequence: java 198
Subject: [java 198] Re: Java Memory Model
Errors-To: owner-java@jp.FreeBSD.org
Sender: owner-java@jp.FreeBSD.org
X-Originator: shudo@computer.org
X-Distribute: distribute version 2.1 (Alpha) patchlevel 24e+020829

----Next_Part(Fri_Aug_30_15:28:55_2002_864)--
Content-Type: Text/Plain; charset=iso-2022-jp
Content-Transfer-Encoding: 7bit

$B<sF#$G$9!#(B

$BBgCO$5$s(B wrote:

> $B$3$&9M$($?:,5r$O!"<B9TCf$K%3!<%I%;%0%a%s%HNN0h$N=q$-49$($O(B*$BIT2DG=(B
> $B$^$?$O$d$k$b$N$8$c$J$$(B*$B$H9M$($F$$$?$+$i$G$7$?!JIT2DG=$8$c$J$$$K$7(B
> $B$F$b!"%3!<%I<+?H$,$+$J$j4D6-$K0MB8$7$?$b$N$K$J$k$7!#(BMSDOS$B$N:"$J$i(B
> $B$H$b$+$/!"(B*BSD$B$G$O$"$^$j$3$&$$$&$3$H$O$d$i$J$$$G$9$h$M!K!#(B

JIT $B%3%s%Q%$%i$O!"(Bmalloc(3) $B$+2?$+$G%G!<%?%;%0%a%s%H$K3NJ]$7$?NN0h$K(B
$B%3!<%I$r@8@.$9$k$N$,IaDL$@$H;W$$$^$9!#(B
$B$J$N$G!"=q$-49$($i$l$k$s$G$9!#(B

$B$^$?!"(Bmprotect(2) $B$r8F$s$G!"(B
$B%F%-%9%H%;%0%a%s%H$r=q$-9~$_2DG=$K$9$k$3$H$b$G$-$k$h$&$G$9!#(B
Linux (2.4.20-pre5) $B$H(B FreeBSD (4.6 8$B7n>e=\$/$i$$$N(B STABLE) $B$G;n$7$^$7$?!#(B

> # $B:#<+J,$b$=$s$J%3!<%I$r=q$-$?$$$H;W$C$F$^$9(B ^^;  $B$3$NJ}K!$,4JC1$K(B
> # $B;n$;$k%=!<%9$C$F$"$j$^$9$+(B?

PATCH_ON_JUMP $B$NJ}K!$r;n$9%3!<%I$r=q$$$F$_$^$7$?!#E:IU$7$^$9!#(B
self-modify.s $B$G$9!#(BLinux, FreeBSD $B$GF0:n3NG'$7$^$7$?!#(B

$B$^$:!"%3!<%I$r=q$-49$($i$l$k$h$&$K$7$F$$$^$9!#(B
$B<!$N(B 2$B$D$NJ}K!$,9M$($i$l$^$9$,!"(B
  (1) $B%3!<%I$r%G!<%?%;%0%a%s%H$K%3%T!<$9$k!#(B
  (2) mprotect(2) $B$r8F$V!#(B
(1) $B$r9T$&$H!"4X?t$N%"%I%l%92r7h$r<+J,$G9T$&$O$a$K$J$C$FBgJQ(B (*) $B$J$N$G!"(B
self-modify.s $B$G$O(B (2) $B$NJ}K!$r:N$C$F$$$^$9!#(B

  (*) shuJIT $B$O<+J,$G2r7h$7$F$^$9!#(B

$BB3$$$F!"!V(Bfoo$B!W$rI=<(!"!V(Bbar$B!W$rI=<(!"$r(B 5$B2s7+$jJV$9%k!<%W$,$"$j$^$9!#(B
$B$7$+$7!"(B2$B2sL\0J9_$N7+$jJV$7$G$O!V(Bbar$B!W$OI=<($5$l$^$;$s!#(B
1$B2sL\$N7+$jJV$7$K$F!"!V(Bbar$B!W$NI=<($r%9%-%C%W$9$k$h$&$K(B
NOP $B$r%8%c%s%WL?Na$G=q$-49$($F$$$k$+$i$G$9!#(B

Kazuyuki Shudo/$B<sF#0l9,(B   $B;d$r$?$P$M$J$$$G(B $B$"$i$;$$$H$&$N2V$N$h$&$K(B
  shudo@computer.org   http://www.shudo.net/

----Next_Part(Fri_Aug_30_15:28:55_2002_864)--
Content-Type: Text/Plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Content-Disposition: inline; filename="self-modify.s"

STR_FOO:
	.string "foo\n"
STR_BAR:
	.string "bar\n"
PTR_FOO:
	.long STR_FOO
PTR_BAR:
	.long STR_BAR


.globl main
.type main,@function

main:
	// call mprotect(<the page which contains main()>,
	//               4 KB, PROT_READ | PROT_WRITE | PROT_EXEC)
	movl  $main,%eax
	andl  $0xfffff000,%eax
	pushl $0x7
		// PROT_READ | PROT_WRITE | PROT_EXEC
	pushl $0x1000
		// 4 KB
	pushl %eax
	call  mprotect@PLT
	addl  $12,%esp

	// initialize the loop counter
	movl  $5,%edi

loop0:
	testl %edi,%edi
	jz    exit
	decl  %edi

	// print "foo"
	pushl PTR_FOO
	call  printf@PLT
	addl  $4,%esp

	// to be patched
	nop
	nop

	// print "bar"
	pushl PTR_BAR
	call  printf@PLT
	addl  $4,%esp

	// patch
	call  .here
.here:
	popl  %ecx
	subl  $0x15,%ecx
		// 0x15 is a magic number
	movw  $0x1eeb,%ax
		// 0x1e is a magic number
	xchg  %ax,(%ecx)

	jmp   loop0

exit:
	ret

----Next_Part(Fri_Aug_30_15:28:55_2002_864)----
