2001-07-02 23:22:55

by Timur Tabi

[permalink] [raw]
Subject: pte_val(*pte) as lvalue

In my driver, I have this code:

unsigned long p = pte_val(*pte);

[set some bits in "p"]

pte_val(*pte) = p;

This works fine in 2.2, and 2.4 when PAE support is disabled. When PAE support
is enabled, it doesn't work, because the pte_val macro can no longer be an
lvalue.

What is the accepted way to assign an integer to a pte that works in 2.2 and
2.4?


--
Timur Tabi - [email protected]
Interactive Silicon - http://www.interactivesi.com


2001-07-02 23:34:14

by Andi Kleen

[permalink] [raw]
Subject: Re: pte_val(*pte) as lvalue

Timur Tabi <[email protected]> writes:

>
> What is the accepted way to assign an integer to a pte that works in 2.2 and
> 2.4?

set_pte(pte, mk_pte( ... ))


-Andi

2001-07-03 18:33:12

by Timur Tabi

[permalink] [raw]
Subject: Re: pte_val(*pte) as lvalue

** Reply to message from Andi Kleen <[email protected]> on 03 Jul 2001 01:33:42 +0200

> Timur Tabi <[email protected]> writes:
>
> >
> > What is the accepted way to assign an integer to a pte that works in 2.2 and
> > 2.4?
>
> set_pte(pte, mk_pte( ... ))

I'm not sure how to use mk_pte. The first parameter is a struct page *, which
I don't have. All I'm doing is modifying the PTE value. I don't want to "make"
another one.


--
Timur Tabi - [email protected]
Interactive Silicon - http://www.interactivesi.com

2001-07-03 18:43:25

by Russell King

[permalink] [raw]
Subject: Re: pte_val(*pte) as lvalue

On Tue, Jul 03, 2001 at 01:32:36PM -0500, Timur Tabi wrote:
> ** Reply to message from Andi Kleen <[email protected]> on 03 Jul 2001 01:33:42 +0200
> > set_pte(pte, mk_pte( ... ))
>
> I'm not sure how to use mk_pte. The first parameter is a struct page *,
> which I don't have. All I'm doing is modifying the PTE value. I don't
> want to "make" another one.

set_pte is the only way you can guarantee that the architecture
implementation gets to do what it needs to do with the PTE value
before stuffing it into the PTE tables.

Can I ask what the nature of the PTE modification is, and where you
are making this modification?

--
Russell King ([email protected]) The developer of ARM Linux
http://www.arm.linux.org.uk/personal/aboutme.html

2001-07-03 18:50:35

by Timur Tabi

[permalink] [raw]
Subject: Re: pte_val(*pte) as lvalue

Russell King wrote:

>Can I ask what the nature of the PTE modification is, and where you
>are making this modification?
>
I've written a hack which enables PAT (Page Address Translation) for a
particular page:

void set_pte_pat(pte_t *pte, unsigned long pat_index)
{
unsigned long p = pte_val(*pte);

p &= ~(_PAGE_PROTNONE | _PAGE_PCD | _PAGE_PWT); // zero-out the
relevant bits

if (pat_index & 4)
p |= _PAGE_PROTNONE;

if (pat_index & 2)
p |= _PAGE_PCD;

if (pat_index & 1)
p |= _PAGE_PWT;

#if CONFIG_X86_PAE
pte->pte_high = 0;
pte->pte_low = p;
#else
pte_val(*pte) = p;
#endif

--
Timur Tabi
Interactive Silicon



2001-07-03 19:11:29

by Russell King

[permalink] [raw]
Subject: Re: pte_val(*pte) as lvalue

On Tue, Jul 03, 2001 at 01:50:05PM -0500, Timur Tabi wrote:
> Russell King wrote:
> >Can I ask what the nature of the PTE modification is, and where you
> >are making this modification?
> >
> I've written a hack which enables PAT (Page Address Translation) for a
> particular page:

Firstly, I'll say I'm no x86 expert by any means. However, it may be
better to extend the pte bit handling functions in
include/asm-i386/pgtable.h to include the bits you need to handle.
(eg, see how pte_mkwrite and pte_wrprotect are implemented.) This is
probably the cleanest way of handling these bits.

--
Russell King ([email protected]) The developer of ARM Linux
http://www.arm.linux.org.uk/personal/aboutme.html