From zaitcev@redhat.com Fri Jun 21 00:23:21 2002
Return-Path:
Date: Fri, 21 Jun 2002 00:23:19 -0400
From: Pete Zaitcev
To: linux390@de.ibm.com
Cc: linux-390@vm.marist.edu, zaitcev@redhat.com
Subject: Putting current in register
Message-ID: <20020621002319.A16389@devserv.devel.redhat.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
User-Agent: Mutt/1.2.5.1i
Content-Length: 558
Lines: 12
Since interrupt stacks were split, current sits in the prefix page.
Did anyone think about returning it into a register? I am not
sufficiently familiar with the architecture to figure it out.
Candidates include control 10 (PER start), control 15 (Linkage),
and GPR 12. Possibly I missed something.
I was thinking about abusing X15, but it seems that applications
may do some mischief trying "extract saved registers" instructions.
PER appears to be used, I am not sure if that's actually the case.
So, I am zooming on R12. Anyone wants to comment?
-- Pete
From Ulrich.Weigand@de.ibm.com Fri Jun 21 07:42:46 2002
From: "BOEBLINGEN LINUX390"
Subject: Re: Putting current in register
To: Pete Zaitcev
Cc: linux-390@vm.marist.edu, zaitcev@redhat.com
X-Mailer: Lotus Notes Release 5.0.3 (Intl) 21 March 2000
Message-ID:
Sender: "Ulrich Weigand"
Date: Fri, 21 Jun 2002 13:42:33 +0200
MIME-Version: 1.0
Content-type: text/plain; charset=us-ascii
Content-Length: 1735
Lines: 40
Pete Zaitcev wrote:
>Since interrupt stacks were split, current sits in the prefix page.
>Did anyone think about returning it into a register? I am not
>sufficiently familiar with the architecture to figure it out.
>Candidates include control 10 (PER start), control 15 (Linkage),
>and GPR 12. Possibly I missed something.
>
>I was thinking about abusing X15, but it seems that applications
>may do some mischief trying "extract saved registers" instructions.
>PER appears to be used, I am not sure if that's actually the case.
>So, I am zooming on R12. Anyone wants to comment?
Using control registers is not a good idea: they might have some
unintended effect on user space, and also setting/accessing them
is slow (they can only be copied from/to memory; also, changing a
CR will often cause a SIE intercept in VM).
You could use R12 (or any other GPR), but at the cost of increasing
register pressure throughout the kernel; currently R12 is used just
as any available register (because kernel code is not -fPIC). I
don't think this trade-off would be worthwhile.
If you want a register that is unused, and fast to access, you
could use an access register; preferably AR3. (It is not used,
but it is already saved/restored on kernel entry/exit because
AR2 and AR4 are used by the kernel.) This would be similar to
linuxthreads using AR0 as thread pointer register. (Of course,
access regs only have 32-bit even in 64-bit mode which is
annoying when you want them to hold a pointer.)
However, what's the point? Loading current from the prefix page
costs one cycle (assuming it is in L1 cache); on our platform
register->register operations and memory->register operations
from L1 usually take the same time.
Bye,
Ulrich
From zaitcev@redhat.com Fri Jun 21 12:28:09 2002
Date: Fri, 21 Jun 2002 12:28:06 -0400
From: Pete Zaitcev
To: BOEBLINGEN LINUX390
Cc: Pete Zaitcev , linux-390@vm.marist.edu
Subject: Re: Putting current in register
Message-ID: <20020621122806.A26211@devserv.devel.redhat.com>
References:
Mime-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
User-Agent: Mutt/1.2.5.1i
In-Reply-To: ; from LINUX390@de.ibm.com on Fri, Jun 21, 2002 at 01:42:33PM +0200
Content-Length: 854
Lines: 19
>[...]
> However, what's the point? Loading current from the prefix page
> costs one cycle (assuming it is in L1 cache); on our platform
> register->register operations and memory->register operations
> from L1 usually take the same time.
I am trying to unmap the prefix page, if I do so the get_current
has to be modified. Obvious option is to store current in a global;
then an access to it would require some cycles to load the pointer
from a global table then reference said pointer. Actually, a global
may be advantageous because it does not need to be preloaded on
every kernel entry. It's not that significant probably, but still.
Just thought I'd explore.
I did not notice that control registers cannot be loaded from
memory. Also, some people think that access registers are 16
bits wide (my copy of PoO lists them as 32 bits wide).
-- Pete
From weigand@faui11.informatik.uni-erlangen.de Fri Jun 21 16:56:34 2002
From: Ulrich Weigand
Message-Id: <200206212056.WAA06507@faui11.informatik.uni-erlangen.de>
Subject: Re: Putting current in register
To: zaitcev@redhat.com
Date: Fri, 21 Jun 2002 22:56:29 +0200 (MET DST)
Cc: LINUX-390@VM.MARIST.EDU
X-Mailer: ELM [version 2.5 PL2]
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Content-Length: 1238
Lines: 39
Pete Zaitcev wrote:
>I am trying to unmap the prefix page, if I do so the get_current
>has to be modified.
Er, it would seem that if you unmap the prefix page, get_current
would be the least of your problems ;-( What about all the other
uses of the lowcore (including those demanded by the architecture
like retrieving the program-interruption condition etc.)?
Again, I fail to see what benefit this is supposed to bring ...
>Obvious option is to store current in a global;
>then an access to it would require some cycles to load the pointer
>from a global table then reference said pointer. Actually, a global
>may be advantageous because it does not need to be preloaded on
>every kernel entry. It's not that significant probably, but still.
>Just thought I'd explore.
And how do you indend to make this per-cpu?
>I did not notice that control registers cannot be loaded from
>memory.
They can be loaded from memory, in fact they can be loaded
*only* from memory.
>Also, some people think that access registers are 16
>bits wide (my copy of PoO lists them as 32 bits wide).
Then it would appear that some people are wrong and the
PoP is right ;-)
Bye,
Ulrich
--
Dr. Ulrich Weigand
weigand@informatik.uni-erlangen.de
From zaitcev Fri Jun 21 17:44:49 2002
Date: Fri, 21 Jun 2002 17:43:16 -0400
From: Pete Zaitcev
To: Ulrich Weigand
Cc: Pete Zaitcev
Subject: Re: Putting current in register
Message-ID: <20020621174316.A13134@devserv.devel.redhat.com>
References: <200206212056.WAA06507@faui11.informatik.uni-erlangen.de>
Mime-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <200206212056.WAA06507@faui11.informatik.uni-erlangen.de>; from weigand@immd1.informatik.uni-erlangen.de on Fri, Jun 21, 2002 at 10:56:29PM +0200
Content-Length: 994
Lines: 28
> From: Ulrich Weigand
> Date: Fri, 21 Jun 2002 22:56:29 +0200 (MET DST)
> >I am trying to unmap the prefix page, if I do so the get_current
> >has to be modified.
>
> Er, it would seem that if you unmap the prefix page, get_current
> would be the least of your problems ;-( What about all the other
> uses of the lowcore (including those demanded by the architecture
> like retrieving the program-interruption condition etc.)?
My reading is that none of them uses virtual storage addressing.
The real page zero must be mapped somewhere, just not at
virtual address zero. Fortunately, you are not using big
pages, so kernel can unmap one page after IPL.
> Again, I fail to see what benefit this is supposed to bring ...
This is supposed to catch NULL pointers. You just wait, I am
going to enable SLAB poisoning too :)
> >Obvious option is to store current in a global;
> And how do you indend to make this per-cpu?
Duh. AR3 then.
-- Pete
From weigand@faui11.informatik.uni-erlangen.de Fri Jun 21 17:55:58 2002
From: Ulrich Weigand
Message-Id: <200206212155.XAA07392@faui11.informatik.uni-erlangen.de>
Subject: Re: Putting current in register
To: zaitcev@redhat.com (Pete Zaitcev)
Date: Fri, 21 Jun 2002 23:55:54 +0200 (MET DST)
In-Reply-To: <20020621174316.A13134@devserv.devel.redhat.com> from "Pete Zaitcev" at Jun 21, 2002 05:43:16 PM
X-Mailer: ELM [version 2.5 PL2]
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Content-Length: 926
Lines: 29
> My reading is that none of them uses virtual storage addressing.
> The real page zero must be mapped somewhere, just not at
> virtual address zero. Fortunately, you are not using big
> pages, so kernel can unmap one page after IPL.
OK, I guess that should work ...
> > Again, I fail to see what benefit this is supposed to bring ...
>
> This is supposed to catch NULL pointers. You just wait, I am
> going to enable SLAB poisoning too :)
You are aware that we have low-address protection switched on
for the kernel address space? Every write access to the low
512 bytes will trap; this should get most NULL pointer write
accesses.
So your scheme would help only with NULL pointer read accesses.
Might still be useful as debugging option, but I don't think it's
worthwhile in a production kernel (too much overhead for too
little gain IMO).
Bye,
Ulrich
--
Dr. Ulrich Weigand
weigand@informatik.uni-erlangen.de
From weigand@faui11.informatik.uni-erlangen.de Fri Jun 21 18:18:59 2002
From: Ulrich Weigand
Message-Id: <200206212218.AAA07760@faui11.informatik.uni-erlangen.de>
Subject: Re: Putting current in register
To: zaitcev@redhat.com (Pete Zaitcev)
Date: Sat, 22 Jun 2002 00:18:55 +0200 (MET DST)
In-Reply-To: <20020621174316.A13134@devserv.devel.redhat.com> from "Pete Zaitcev" at Jun 21, 2002 05:43:16 PM
X-Mailer: ELM [version 2.5 PL2]
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Status: RO
X-Status: A
Content-Length: 895
Lines: 25
> My reading is that none of them uses virtual storage addressing.
> The real page zero must be mapped somewhere, just not at
> virtual address zero.
Ah, it's more difficult. If you don't have the lowcore, I don't
see how userkernel space transitions can be made to work.
The problem is that you need to save all registers on kernel
entry. The only thing the hardware saves for you is the PSW,
everything else must be done manually. Now, just *where* can
you save registers? Loading any address into a register
clobbers it, and the only addresses that can be used as
immediate addresses without registers are those below 4096.
So you *need* the page at virtual address 0 to be present.
Check out the SAVE_ALL_BASE macro in entry.S how it is
currently done; I don't believe this can be done without
lowcore.
Bye,
Ulrich
--
Dr. Ulrich Weigand
weigand@informatik.uni-erlangen.de
From zaitcev@redhat.com Fri Jun 21 18:47:13 2002
Return-Path:
Date: Fri, 21 Jun 2002 18:45:40 -0400
From: Pete Zaitcev
To: Ulrich Weigand
Cc: Pete Zaitcev
Subject: Re: Putting current in register
Message-ID: <20020621184540.A925@devserv.devel.redhat.com>
References: <20020621174316.A13134@devserv.devel.redhat.com> <200206212218.AAA07760@faui11.informatik.uni-erlangen.de>
Mime-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
User-Agent: Mutt/1.2.5.1i
In-Reply-To: <200206212218.AAA07760@faui11.informatik.uni-erlangen.de>; from weigand@immd1.informatik.uni-erlangen.de on Sat, Jun 22, 2002 at 12:18:55AM +0200
Content-Length: 604
Lines: 15
> From: Ulrich Weigand
> Date: Sat, 22 Jun 2002 00:18:55 +0200 (MET DST)
>[...]
> The problem is that you need to save all registers on kernel
> entry. The only thing the hardware saves for you is the PSW,
> everything else must be done manually. Now, just *where* can
> you save registers? Loading any address into a register
> clobbers it, and the only addresses that can be used as
> immediate addresses without registers are those below 4096.
> So you *need* the page at virtual address 0 to be present.
I guess I have give up the idea then.
-- Pete