comp.lang.ada
 help / color / mirror / Atom feed
From: Niklas Holsti <niklas.holsti@tidorum.invalid>
Subject: Re: Oberon and Wirthian languages
Date: Tue, 22 Apr 2014 22:13:50 +0300
Date: 2014-04-22T22:13:50+03:00	[thread overview]
Message-ID: <brntbeFnfgcU1@mid.individual.net> (raw)
In-Reply-To: <lj5n4g$jse$1@dont-email.me>

On 14-04-22 15:25 , Simon Clubley wrote:
> On 2014-04-22, Simon Wright <simon@pushface.org> wrote:
>
> In general memory mapped I/O you have to do a register read/modify bit
> field/register write sequence in units of the register size.
> 
> Consider a atomic record with 3 bit fields called A, B and C.
> 
> Now consider a Ada record assignment statement which sets the values of
> the 3 bit fields. The question is how is the assignment to the 3 bit
> fields turned into code ?

If the record variable Rec has the Atomic aspect, then by the Ada RM any
assignment Rec := expr must write Rec exactly once, indivisibly, and
this write should (per implementation advice) be implemented by a single
store instruction. This applies whatever the right-hand-side expr is.

Note, however, that if the right-hand-side expr includes some references
to (i.e. reads of) Rec, then there is no guarantee that the read-write
sequence as a whole is indivisible.

> Is it something like this (which is how it looks in C with masks):

Here one should separate between C 2011 on the one hand and earlier C
standards on the other. (For C 2011 my reference is the "final" draft
N1570, which is on the web.)

In C 2011, a "compound assignment is a read-modify-write operation with
memory_order_seq_cst memory order semantics". That is, in C 2011 an
update like "v &= mask", where v is an _Atomic variable, is an atomic
*update* with respect to other C threads (but perhaps not with respect
to other memory bus activity; I admit to an incomplete understanding
here). Note that this is rather different from the meaning of the Atomic
aspect in Ada, which only makes each read indivisible, and each write
indivisible, but does not guarantee indivisibility of some
read-modify-write sequence.

In earlier C standards such as the 1999 standard, the only concept of
atomicity was the predefined type sig_atomic_t, which corresponds
closely to the Ada Atomic aspect, that is, the whole variable can be
read or written with one memory access.

> 	ldr	r2, [r3, #register_offset]
> 				-- Load device register contents into r2
> 				-- r3 contains device base address
> 	orr	r2, r2, #1	-- Set bit field A to 1
> 	{Additional code here to modify bitfields B and C}
> 	str	r2, [r3, #register_offset]
> 				-- Write all changes to device register at once

Yes, this looks like an Ada assignment of the form

   Tmp := Rec;
   Rec := (A => 1, B => expr1, C => expr2, D => Tmp.D, E => Tmp.E, ...);

where Rec has aspect Atomic and assuming that the compiler was able to
optimize out the "no effect" expressions for the unchanged components D,
E, .... Note that the following "simpler" assignment

   Rec := (A => 1, B => expr1, C => expr2, D => Rec.D, E => Rec.E, ...);

cannot give the code above -- the two (or more) uses of Rec in the
aggregate force the code to read (load) Rec two (or more) times, because
an Atomic variable is also Volatile. (That is how I understand it, but
I'm not entirely sure if each appearance of an object's name in the
source code as a primary implies the evaluation of the object and
therefore a "read" of the object.) This assumes a reasonable
implementation of the Volatile aspect.

> or is the Ada compiler allowed to do this:
> 
> 	ldr	r2, [r3, #register_offset]
> 	orr	r2, r2, #1			-- Set bit field A to 1
> 	str	r2, [r3, #register_offset]	-- Update bit field A only
> 
> 	ldr	r2, [r3, #register_offset]
> 	{Code here to modify bitfield B}
> 	str	r2, [r3, #register_offset]	-- Update bit field B only
> 
> 	ldr	r2, [r3, #register_offset]
> 	{Code here to modify bitfield C}
> 	str	r2, [r3, #register_offset]	-- Update bit field C only

No, three stores to Rec can result only if the source code contains
three assignments to Rec as a whole, or some assignments to components
of Rec.

> Ie: performs a atomic update of each bit field,

In what sense do you call these bit-field updates "atomic"?

Yes, the entire record variable is read with one memory access and
written with one memory access; this is the Atomic aspect in Ada and C 1999.

But no, they are not "atomic read-modify-write updates" in the sense of
C 2011 _Atomic, or in the sense of Ada protected operations. I assume,
as usual, that instruction sequences such as those above are not
indivisible.

> You also then have additional issues around wanting to, say, update bit
> fields B and C at the same time while preserving the current value of
> bit field A (which is where my "atomic using" suggestion comes in for
> a C replacement language).

The _Atomic qualifier of C 2011 might be used to make that whole update
atomic, with respect to C threads, if all the modified bits are set to
0, or all are set to 1, because then the update can be coded as one C
compound assignment (Rec &= mask, or Rec |= mask, respectively). But if
some bits are set to 0 and others to 1, then the update cannot be one C
compound assignment beause both an "and" and an "or" operation are required.

-- 
Niklas Holsti
Tidorum Ltd
niklas holsti tidorum fi
      .      @       .


  reply	other threads:[~2014-04-22 19:13 UTC|newest]

Thread overview: 144+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-04-11  2:39 Heartbleed Charles H. Sampson
2014-04-11  7:59 ` Heartbleed Maciej Sobczak
2014-04-11 10:50   ` Heartbleed Pascal J. Bourguignon
2014-04-12  1:46   ` Heartbleed Charles H. Sampson
2014-04-11 12:43 ` Heartbleed kalvin.news
2014-04-11 19:33   ` Heartbleed Simon Clubley
2014-04-12  4:58     ` Heartbleed Shark8
2014-04-12  7:15       ` Heartbleed Nasser M. Abbasi
2014-04-12  9:28         ` Heartbleed Georg Bauhaus
2014-04-12  9:33         ` Heartbleed Georg Bauhaus
2014-04-12 11:42         ` Heartbleed Pascal J. Bourguignon
2014-04-12 15:37           ` Heartbleed Nasser M. Abbasi
2014-04-12 18:56             ` Heartbleed Pascal J. Bourguignon
2014-04-12 20:29               ` Heartbleed Yannick Duchêne (Hibou57)
2014-04-12 20:34               ` Heartbleed Dmitry A. Kazakov
2014-04-12 20:47                 ` Heartbleed Yannick Duchêne (Hibou57)
2014-04-12 20:53                   ` Heartbleed Yannick Duchêne (Hibou57)
2014-04-15 10:02                 ` Heartbleed Yannick Duchêne (Hibou57)
2014-04-15 12:35                   ` Heartbleed Dmitry A. Kazakov
2014-04-12 21:57               ` Heartbleed Niklas Holsti
2014-04-13 13:08                 ` Heartbleed Georg Bauhaus
2014-04-13 13:55                   ` Heartbleed Pascal J. Bourguignon
2014-04-13 15:13                     ` Heartbleed Dennis Lee Bieber
2014-04-13 15:36                       ` Heartbleed Nasser M. Abbasi
2014-04-12 18:39           ` Heartbleed Simon Wright
2014-04-12 19:15             ` Heartbleed Pascal J. Bourguignon
2014-04-12 19:18               ` Heartbleed Pascal J. Bourguignon
2014-04-12 20:40               ` Heartbleed Yannick Duchêne (Hibou57)
2014-04-12 20:44               ` Heartbleed Yannick Duchêne (Hibou57)
2014-04-12 21:31               ` Heartbleed Niklas Holsti
2014-04-12 14:58         ` Heartbleed Dennis Lee Bieber
2014-04-12 18:28           ` Heartbleed Yannick Duchêne (Hibou57)
2014-04-12 18:22       ` Heartbleed Yannick Duchêne (Hibou57)
2014-04-12 18:38       ` Heartbleed Simon Clubley
2014-04-12 20:24         ` Heartbleed Yannick Duchêne (Hibou57)
2014-04-12 21:48           ` Heartbleed Simon Clubley
2014-04-17  6:15         ` Heartbleed Jacob Sparre Andersen
2014-04-17 15:55           ` Heartbleed Shark8
2014-04-17 21:01           ` Heartbleed Simon Clubley
2014-04-17 21:51             ` Heartbleed Shark8
2014-04-17 21:54               ` Heartbleed Alan Jump
2014-04-17 22:02                 ` Heartbleed Adam Beneschan
2014-04-17 22:35                 ` Heartbleed Simon Clubley
2014-04-17 22:55                   ` Heartbleed Jeffrey Carter
2014-04-18  8:48                     ` Heartbleed Simon Clubley
2014-04-18 18:02                       ` Heartbleed Jeffrey Carter
2014-04-18 20:31                         ` Heartbleed Yannick Duchêne (Hibou57)
2014-04-18 23:16                           ` Heartbleed Pascal J. Bourguignon
2014-04-19 18:29                             ` Heartbleed Simon Clubley
2014-04-21 22:50                             ` Heartbleed Randy Brukardt
2014-04-18  1:38                   ` Heartbleed Yannick Duchêne (Hibou57)
2014-04-18 14:59                     ` Heartbleed Nasser M. Abbasi
2014-04-18 17:12                       ` Heartbleed Alan Browne
2014-04-18 17:30                       ` Heartbleed J-P. Rosen
2014-04-18 18:04                         ` Heartbleed Jeffrey Carter
2014-04-18 18:34                           ` Heartbleed Simon Clubley
2014-04-18 20:45                             ` Heartbleed Jeffrey Carter
2014-04-18 21:35                             ` Heartbleed Dennis Lee Bieber
2014-04-18 22:20                               ` Heartbleed Jeffrey Carter
2014-04-18 22:41                                 ` Heartbleed Adam Beneschan
2014-04-19 15:53                                   ` Heartbleed Dennis Lee Bieber
2014-04-18 18:37                           ` Heartbleed Alan Browne
2014-04-18 20:45                             ` Heartbleed Jeffrey Carter
2014-04-18 21:06                               ` Heartbleed Alan Browne
2014-04-18 22:20                                 ` Heartbleed Jeffrey Carter
2014-04-19 14:04                                   ` Heartbleed Alan Browne
2014-04-18 20:49                             ` Heartbleed Shark8
2014-04-18 21:07                               ` Heartbleed Alan Browne
2014-04-18 22:56                           ` Heartbleed Nasser M. Abbasi
2014-04-19  4:27                             ` Heartbleed tmoran
2014-04-18 21:17                   ` Heartbleed Shark8
2014-04-19 18:59                     ` Heartbleed Simon Clubley
2014-04-19 19:21                       ` Heartbleed Shark8
2014-04-18  1:29             ` Heartbleed Yannick Duchêne (Hibou57)
2014-04-18 10:42               ` Heartbleed J-P. Rosen
2014-04-19 11:50         ` Oberon and Wirthian languages (was: Heartbleed) Ludovic Brenta
2014-04-19 12:46           ` Oberon and Wirthian languages Georg Bauhaus
2014-04-19 19:17             ` Simon Clubley
2014-04-19 19:25               ` Shark8
2014-04-19 16:35           ` Oberon and Wirthian languages (was: Heartbleed) Yannick Duchêne (Hibou57)
2014-04-19 19:32             ` Simon Clubley
2014-04-19 22:30               ` Dennis Lee Bieber
2014-04-19 22:35                 ` Oberon and Wirthian languages Alan Browne
2014-04-19 16:53           ` Georg Bauhaus
2014-04-19 17:32           ` Simon Wright
2014-04-19 17:35           ` Jeffrey Carter
2014-04-19 18:06             ` Yannick Duchêne (Hibou57)
2014-04-19 18:53             ` Shark8
2014-04-19 20:08               ` Simon Clubley
2014-04-19 22:16                 ` Simon Clubley
2014-04-21 13:06           ` Oberon and Wirthian languages (was: Heartbleed) Simon Clubley
2014-04-21 18:13             ` Simon Clubley
2014-04-21 18:45               ` Oberon and Wirthian languages Shark8
2014-04-21 23:26                 ` Randy Brukardt
2014-04-22  0:21                   ` Simon Clubley
2014-04-22  5:48                   ` Shark8
2014-04-21 18:16             ` Jeffrey Carter
2014-04-22  0:34               ` Simon Clubley
2014-04-22  3:01                 ` Jeffrey Carter
2014-04-22 23:31                   ` Randy Brukardt
2014-04-22  6:41                 ` Simon Wright
2014-04-22 12:25                   ` Simon Clubley
2014-04-22 19:13                     ` Niklas Holsti [this message]
2014-04-22 20:46                       ` Simon Clubley
2014-04-22 23:38                         ` Randy Brukardt
2014-04-23 12:16                           ` Simon Clubley
2014-04-23 20:55                             ` Simon Wright
2014-04-24  0:20                               ` Simon Clubley
2014-04-24 13:05                                 ` Niklas Holsti
2014-04-24 18:51                                   ` Simon Clubley
2014-04-24 20:11                                     ` Niklas Holsti
2014-04-25  1:37                                       ` Randy Brukardt
2014-04-25 21:33                                         ` Simon Clubley
2014-04-25 21:55                                           ` Randy Brukardt
2014-04-25 23:16                                             ` Dennis Lee Bieber
2014-04-26  6:31                                               ` Niklas Holsti
2014-04-26  0:23                                             ` Nasser M. Abbasi
2014-04-26  2:46                                             ` Shark8
2014-04-26  2:52                                               ` Shark8
2014-04-26  6:37                                               ` Niklas Holsti
2014-04-26  6:19                                             ` Georg Bauhaus
2014-04-26  6:35                                               ` Georg Bauhaus
2014-04-26  6:42                                               ` Niklas Holsti
2014-04-26 17:15                                                 ` Simon Clubley
2014-04-26  6:29                                             ` Niklas Holsti
2014-04-26  7:36                                               ` Dmitry A. Kazakov
2014-04-26  7:52                                                 ` Georg Bauhaus
2014-04-26  8:09                                                   ` Dmitry A. Kazakov
2014-04-26 18:32                                                 ` Simon Clubley
2014-05-08  2:36                                               ` Randy Brukardt
2014-05-08 17:48                                                 ` Niklas Holsti
2014-05-08 19:22                                                   ` Randy Brukardt
2014-04-26  7:23                                             ` Simon Wright
2014-04-26  9:27                                               ` Niklas Holsti
2014-04-26 12:34                                                 ` Simon Wright
2014-04-27 10:38                                                   ` Simon Wright
2014-04-27 15:36                                                     ` Simon Clubley
2014-04-27 14:26                                               ` Brian Drummond
2014-04-22 23:30                 ` Randy Brukardt
2014-04-23 12:17                   ` Simon Clubley
2014-05-14  9:39         ` Heartbleed gvdschoot
2014-04-12 22:01       ` Heartbleed Yannick Duchêne (Hibou57)
2014-04-18 17:58         ` Heartbleed Alan Browne
2014-04-18 17:24 ` Heartbleed - attacks? Alan Browne
replies disabled

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox