From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 5834 invoked by alias); 4 Dec 2003 11:57:18 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 5821 invoked from network); 4 Dec 2003 11:57:16 -0000 Received: from unknown (HELO sohm.kpit.com) (203.129.230.82) by sources.redhat.com with SMTP; 4 Dec 2003 11:57:16 -0000 Content-Class: urn:content-classes:message MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable X-MimeOLE: Produced By Microsoft Exchange V6.0.6249.0 Subject: PATCH : H8300 GDB simulator Date: Thu, 04 Dec 2003 11:57:00 -0000 Message-ID: <69595093233BB547BB70CF5E492B63F203107807@sohm.kpit.com> X-MS-Has-Attach: X-MS-TNEF-Correlator: From: "Anil Paranjape" To: X-SW-Source: 2003-12/txt/msg00110.txt.bz2 Hi, The CPU can access word data and longword data in memory, but word or longw= ord data must begin at an even address. If an attempt is made to access wor= d or longword data at an odd address, no address error occurs but the least= significant bit of the address is regarded as 0, so the access starts at t= he preceding address. This is the case in actual H/W. Now if an odd address is assigned to any word or long word memory pointer i= n H8 simulator and then if data at that address is accessed byte by byte th= en simulator was neither showing correct data (which is the case in actual = H/W) not generating SIGBUS exception (which is the case in SH). Patch below fixes this problem and after patch, simulator shows correct val= ue as is the case in actual H/W. ChangeLog/sim/h8300 2003-12-03 Anil Paranjpe * compile.c : In all word and double word memory operations,=20 address is forced to be always even. Patch for /sim/h8300/compile.c --- compile.c.orig Fri Oct 17 18:15:56 2003 +++ compile.c Wed Dec 3 22:04:22 2003 @@ -1265,20 +1265,19 @@ =20 #define GET_MEMORY_L(X) \ ((X) < memory_size \ - ? ((h8_get_memory (sd, (X)+0) << 24) | (h8_get_memory (sd, (X)+1) << 16= ) \ - | (h8_get_memory (sd, (X)+2) << 8) | (h8_get_memory (sd, (X)+3) << 0= )) \ - : ((h8_get_eightbit (sd, ((X)+0) & 0xff) << 24) \ - | (h8_get_eightbit (sd, ((X)+1) & 0xff) << 16) \ - | (h8_get_eightbit (sd, ((X)+2) & 0xff) << 8) \ - | (h8_get_eightbit (sd, ((X)+3) & 0xff) << 0))) + ? ((h8_get_memory (sd, ((X) & 0xfffffffe)+0) << 24) | (h8_get_memory (s= d, ((X) & 0xfffffffe)+1) << 16) \ + | (h8_get_memory (sd, ((X) & 0xfffffffe)+2) << 8) | (h8_get_memory (s= d, ((X) & 0xfffffffe)+3) << 0)) \ + : ((h8_get_eightbit (sd, (((X) & 0xfffffffe)+0) & 0xff) << 24) \ + | (h8_get_eightbit (sd, (((X) & 0xfffffffe)+1) & 0xff) << 16) \ + | (h8_get_eightbit (sd, (((X) & 0xfffffffe)+2) & 0xff) << 8) \ + | (h8_get_eightbit (sd, (((X) & 0xfffffffe)+3) & 0xff) << 0))) =20 #define GET_MEMORY_W(X) \ ((X) < memory_size \ - ? ((h8_get_memory (sd, (X)+0) << 8) \ - | (h8_get_memory (sd, (X)+1) << 0)) \ - : ((h8_get_eightbit (sd, ((X)+0) & 0xff) << 8) \ - | (h8_get_eightbit (sd, ((X)+1) & 0xff) << 0))) - + ? ((h8_get_memory (sd, ((X) & 0xfffffffe)+0) << 8) \ + | (h8_get_memory (sd, ((X) & 0xfffffffe)+1) << 0)) \ + : ((h8_get_eightbit (sd, (((X) & 0xfffffffe)+0) & 0xff) << 8) \ + | (h8_get_eightbit (sd, (((X) & 0xfffffffe)+1) & 0xff) << 0))) =20 #define GET_MEMORY_B(X) \ ((X) < memory_size ? (h8_get_memory (sd, (X))) \ @@ -1286,16 +1285,16 @@ =20 #define SET_MEMORY_L(X, Y) \ { register unsigned char *_p; register int __y =3D (Y); \ - _p =3D ((X) < memory_size ? h8_get_memory_buf (sd) + (X) : \ - h8_get_eightbit_buf (sd) + ((X) & 0xff)); \ + _p =3D ((X) < memory_size ? h8_get_memory_buf (sd) + ((X) & 0xfffff= ffe) : \ + h8_get_eightbit_buf (sd) + (((X) & 0xfffffffe= ) & 0xff)); \ _p[0] =3D __y >> 24; _p[1] =3D __y >> 16; \ _p[2] =3D __y >> 8; _p[3] =3D __y >> 0; \ } =20 #define SET_MEMORY_W(X, Y) \ { register unsigned char *_p; register int __y =3D (Y); \ - _p =3D ((X) < memory_size ? h8_get_memory_buf (sd) + (X) : \ - h8_get_eightbit_buf (sd) + ((X) & 0xff)); \ + _p =3D ((X) < memory_size ? h8_get_memory_buf (sd) + ((X) & 0xffffff= fe) : \ + h8_get_eightbit_buf (sd) + (((X) & 0xfffffffe= ) & 0xff)); \ _p[0] =3D __y >> 8; _p[1] =3D __y; \ } =20 Regards, Anil Paranjpe