Use all 64 address bits in ld*a()/st*a() macros so physical device addresses

work.  (Also add some bus_space_*() debug hooks).
This commit is contained in:
eeh 2000-06-02 22:56:32 +00:00
parent 02cd59a751
commit 03228642f7
3 changed files with 475 additions and 155 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: bus.h,v 1.15 2000/04/22 17:06:06 mrg Exp $ */
/* $NetBSD: bus.h,v 1.16 2000/06/02 22:56:33 eeh Exp $ */
/*-
* Copyright (c) 1996, 1997, 1998 The NetBSD Foundation, Inc.
@ -356,7 +356,7 @@ int bus_space_probe __P((
* Read a 1, 2, 4, or 8 byte quantity from bus space
* described by tag/handle/offset.
*/
#if 1
#ifndef BUS_SPACE_DEBUG
#define bus_space_read_1(t, h, o) \
lduba((h) + (o), bus_type_asi[(t)->type])
@ -369,18 +369,42 @@ int bus_space_probe __P((
#define bus_space_read_8(t, h, o) \
ldxa((h) + (o), bus_type_asi[(t)->type])
#else
/* For the time being don't use address spaces */
#define bus_space_read_1(t, h, o) \
(*(volatile u_int8_t *)((h) + (o)))
extern int bus_space_debug;
#define bus_space_read_1(t, h, o) ({ \
unsigned char __bv = \
lduba((h) + (o), bus_type_asi[(t)->type]); \
if (bus_space_debug) \
printf("bsr1(%llx + %llx, %x) -> %x\n", (u_int64_t)(h), \
(u_int64_t)(o), \
bus_type_asi[(t)->type], (unsigned int) __bv); \
__bv; })
#define bus_space_read_2(t, h, o) \
(*(volatile u_int16_t *)((h) + (o)))
#define bus_space_read_2(t, h, o) ({ \
unsigned short __bv = \
lduha((h) + (o), bus_type_asi[(t)->type]); \
if (bus_space_debug) \
printf("bsr2(%llx + %llx, %x) -> %x\n", (u_int64_t)(h), \
(u_int64_t)(o), \
bus_type_asi[(t)->type], (unsigned int)__bv); \
__bv; })
#define bus_space_read_4(t, h, o) \
(*(volatile u_int32_t *)((h) + (o)))
#define bus_space_read_4(t, h, o) ({ \
unsigned int __bv = \
lda((h) + (o), bus_type_asi[(t)->type]); \
if (bus_space_debug) \
printf("bsr4(%llx + %llx, %x) -> %x\n", (u_int64_t)(h), \
(u_int64_t)(h), \
bus_type_asi[(t)->type], __bv); \
__bv; })
#define bus_space_read_8(t, h, o) \
(*(volatile u_int64_t *)((h) + (o)))
#define bus_space_read_8(t, h, o) ({ \
u_int64_t __bv = \
ldxa((h) + (o), bus_type_asi[(t)->type]); \
if (bus_space_debug) \
printf("bsr8(%llx + %llx, %x) -> %llx\n", (u_int64_t)(h), \
(u_int64_t) (o), \
bus_type_asi[(t)->type], __bv); \
__bv; })
#endif
/*
* void bus_space_read_multi_N __P((bus_space_tag_t tag,
@ -427,7 +451,7 @@ int bus_space_probe __P((
* Write the 1, 2, 4, or 8 byte value `value' to bus space
* described by tag/handle/offset.
*/
#if 1
#ifndef BUS_SPACE_DEBUG
#define bus_space_write_1(t, h, o, v) \
((void)(stba((h) + (o), bus_type_asi[(t)->type], (v))))
@ -440,22 +464,33 @@ int bus_space_probe __P((
#define bus_space_write_8(t, h, o, v) \
((void)(stxa((h) + (o), bus_type_asi[(t)->type], (v))))
#else
/* Use primary ASI for now for debug */
#define bus_space_write_1(t, h, o, v) do { \
((void)(*(volatile u_int8_t *)((h) + (o)) = (v))); \
} while (0)
#define bus_space_write_1(t, h, o, v) ({ \
if (bus_space_debug) \
printf("bsw1(%llx + %llx, %x) <- %x\n", (u_int64_t)(h), \
(u_int64_t)(o), \
bus_type_asi[(t)->type], (unsigned int) v); \
((void)(stba((h) + (o), bus_type_asi[(t)->type], (v)))); })
#define bus_space_write_2(t, h, o, v) do { \
((void)(*(volatile u_int16_t *)((h) + (o)) = (v))); \
} while (0)
#define bus_space_write_2(t, h, o, v) ({ \
if (bus_space_debug) \
printf("bsw2(%llx + %llx, %x) <- %x\n", (u_int64_t)(h), \
(u_int64_t)(o), \
bus_type_asi[(t)->type], (unsigned int) v); \
((void)(stha((h) + (o), bus_type_asi[(t)->type], (v)))); })
#define bus_space_write_4(t, h, o, v) do { \
((void)(*(volatile u_int32_t *)((h) + (o)) = (v))); \
} while (0)
#define bus_space_write_4(t, h, o, v) ({ \
if (bus_space_debug) \
printf("bsw4(%llx + %llx, %x) <- %x\n", (u_int64_t)(h), \
(u_int64_t)(o), \
bus_type_asi[(t)->type], (unsigned int) v); \
((void)(sta((h) + (o), bus_type_asi[(t)->type], (v)))); })
#define bus_space_write_8(t, h, o, v) do { \
((void)(*(volatile u_int64_t *)((h) + (o)) = (v))); \
} while (0)
#define bus_space_write_8(t, h, o, v) ({ \
if (bus_space_debug) \
printf("bsw8(%llx + %llx, %x) <- %llx\n", (u_int64_t)(h), \
(u_int64_t)(o), \
bus_type_asi[(t)->type], (u_int64_t) v); \
((void)(stxa((h) + (o), bus_type_asi[(t)->type], (v)))); })
#endif
/*
* void bus_space_write_multi_N __P((bus_space_tag_t tag,
@ -527,40 +562,296 @@ int bus_space_probe __P((
bus_space_write_8(t, h, o, v); \
} while (0)
/*
* void bus_space_read_region_N __P((bus_space_tag_t tag,
* bus_space_handle_t bsh, bus_size_t off,
* u_intN_t *addr, bus_size_t count));
*
*/
void bus_space_read_region_1 __P((bus_space_tag_t,
bus_space_handle_t,
bus_size_t,
u_int8_t *,
bus_size_t));
void bus_space_read_region_2 __P((bus_space_tag_t,
bus_space_handle_t,
bus_size_t,
u_int16_t *,
bus_size_t));
void bus_space_read_region_4 __P((bus_space_tag_t,
bus_space_handle_t,
bus_size_t,
u_int32_t *,
bus_size_t));
void bus_space_read_region_8 __P((bus_space_tag_t,
bus_space_handle_t,
bus_size_t,
u_int64_t *,
bus_size_t));
extern __inline__ void
bus_space_read_region_1(t, h, o, a, c)
bus_space_tag_t t;
bus_space_handle_t h;
bus_size_t o, c;
u_int8_t *a;
{
for (; c; a++, c--, o++)
*a = bus_space_read_1(t, h, o);
}
extern __inline__ void
bus_space_read_region_2(t, h, o, a, c)
bus_space_tag_t t;
bus_space_handle_t h;
bus_size_t o, c;
u_int16_t *a;
{
for (; c; a++, c--, o+=2)
*a = bus_space_read_1(t, h, o);
}
extern __inline__ void
bus_space_read_region_4(t, h, o, a, c)
bus_space_tag_t t;
bus_space_handle_t h;
bus_size_t o, c;
u_int32_t *a;
{
for (; c; a++, c--, o+=4)
*a = bus_space_read_1(t, h, o);
}
extern __inline__ void
bus_space_read_region_8(t, h, o, a, c)
bus_space_tag_t t;
bus_space_handle_t h;
bus_size_t o, c;
u_int64_t *a;
{
for (; c; a++, c--, o+=8)
*a = bus_space_read_1(t, h, o);
}
/*
* void bus_space_copy_N __P((bus_space_tag_t tag,
* void bus_space_write_region_N __P((bus_space_tag_t tag,
* bus_space_handle_t bsh, bus_size_t off,
* u_intN_t *addr, bus_size_t count));
*
*/
void bus_space_write_region_1 __P((bus_space_tag_t,
bus_space_handle_t,
bus_size_t,
const u_int8_t *,
bus_size_t));
void bus_space_write_region_2 __P((bus_space_tag_t,
bus_space_handle_t,
bus_size_t,
const u_int16_t *,
bus_size_t));
void bus_space_write_region_4 __P((bus_space_tag_t,
bus_space_handle_t,
bus_size_t,
const u_int32_t *,
bus_size_t));
void bus_space_write_region_8 __P((bus_space_tag_t,
bus_space_handle_t,
bus_size_t,
const u_int64_t *,
bus_size_t));
extern __inline__ void
bus_space_write_region_1(t, h, o, a, c)
bus_space_tag_t t;
bus_space_handle_t h;
bus_size_t o, c;
const u_int8_t *a;
{
for (; c; a++, c--, o++)
bus_space_write_1(t, h, o, *a);
}
extern __inline__ void
bus_space_write_region_2(t, h, o, a, c)
bus_space_tag_t t;
bus_space_handle_t h;
bus_size_t o, c;
const u_int16_t *a;
{
for (; c; a++, c--, o+=2)
bus_space_write_2(t, h, o, *a);
}
extern __inline__ void
bus_space_write_region_4(t, h, o, a, c)
bus_space_tag_t t;
bus_space_handle_t h;
bus_size_t o, c;
const u_int32_t *a;
{
for (; c; a++, c--, o+=4)
bus_space_write_4(t, h, o, *a);
}
extern __inline__ void
bus_space_write_region_8(t, h, o, a, c)
bus_space_tag_t t;
bus_space_handle_t h;
bus_size_t o, c;
const u_int64_t *a;
{
for (; c; a++, c--, o+=8)
bus_space_write_8(t, h, o, *a);
}
/*
* void bus_space_set_region_N __P((bus_space_tag_t tag,
* bus_space_handle_t bsh, bus_size_t off,
* u_intN_t *addr, bus_size_t count));
*
*/
void bus_space_set_region_1 __P((bus_space_tag_t,
bus_space_handle_t,
bus_size_t,
const u_int8_t,
bus_size_t));
void bus_space_set_region_2 __P((bus_space_tag_t,
bus_space_handle_t,
bus_size_t,
const u_int16_t,
bus_size_t));
void bus_space_set_region_4 __P((bus_space_tag_t,
bus_space_handle_t,
bus_size_t,
const u_int32_t,
bus_size_t));
void bus_space_set_region_8 __P((bus_space_tag_t,
bus_space_handle_t,
bus_size_t,
const u_int64_t,
bus_size_t));
extern __inline__ void
bus_space_set_region_1(t, h, o, v, c)
bus_space_tag_t t;
bus_space_handle_t h;
bus_size_t o, c;
const u_int8_t v;
{
for (; c; c--, o++)
bus_space_write_1(t, h, o, v);
}
extern __inline__ void
bus_space_set_region_2(t, h, o, v, c)
bus_space_tag_t t;
bus_space_handle_t h;
bus_size_t o, c;
const u_int16_t v;
{
for (; c; c--, o+=2)
bus_space_write_2(t, h, o, v);
}
extern __inline__ void
bus_space_set_region_4(t, h, o, v, c)
bus_space_tag_t t;
bus_space_handle_t h;
bus_size_t o, c;
const u_int32_t v;
{
for (; c; c--, o+=4)
bus_space_write_4(t, h, o, v);
}
extern __inline__ void
bus_space_set_region_8(t, h, o, v, c)
bus_space_tag_t t;
bus_space_handle_t h;
bus_size_t o, c;
const u_int64_t v;
{
for (; c; c--, o+=8)
bus_space_write_8(t, h, o, v);
}
/*
* void bus_space_copy_region_N __P((bus_space_tag_t tag,
* bus_space_handle_t bsh1, bus_size_t off1,
* bus_space_handle_t bsh2, bus_size_t off2,
* size_t count));
* bus_size_t count));
*
* Copy `count' 1, 2, 4, or 8 byte values from bus space starting
* at tag/bsh1/off1 to bus space starting at tag/bsh2/off2.
*/
void bus_space_copy_region_1 __P((bus_space_tag_t,
bus_space_handle_t,
bus_size_t,
bus_space_handle_t,
bus_size_t,
bus_size_t));
void bus_space_copy_region_2 __P((bus_space_tag_t,
bus_space_handle_t,
bus_size_t,
bus_space_handle_t,
bus_size_t,
bus_size_t));
void bus_space_copy_region_4 __P((bus_space_tag_t,
bus_space_handle_t,
bus_size_t,
bus_space_handle_t,
bus_size_t,
bus_size_t));
void bus_space_copy_region_8 __P((bus_space_tag_t,
bus_space_handle_t,
bus_size_t,
bus_space_handle_t,
bus_size_t,
bus_size_t));
#define bus_space_copy_region_1(t, h1, o1, h2, o2, c) \
{ int i = c; \
for (; i; i--, o1++, o2++) \
bus_space_write_1(t, h1, o1, bus_space_read_1(t, h2, o2)); \
} while (0)
#define bus_space_copy_region_2(t, h1, o1, h2, o2, c) \
{ int i = c; \
for (; i; i--, o1 += 2, o2 += 2) \
bus_space_write_2(t, h1, o1, bus_space_read_2(t, h2, o2)); \
} while (0)
extern __inline__ void
bus_space_copy_region_1(t, h1, o1, h2, o2, c)
bus_space_tag_t t;
bus_space_handle_t h1, h2;
bus_size_t o1, o2;
bus_size_t c;
{
for (; c; c--, o1++, o2++)
bus_space_write_1(t, h1, o1, bus_space_read_1(t, h2, o2));
}
#define bus_space_copy_region_4(t, h1, o1, h2, o2, c) \
{ int i = c; \
for (; i; i--, o1 += 4, o2 += 4) \
bus_space_write_4(t, h1, o1, bus_space_read_4(t, h2, o2)); \
} while (0)
extern __inline__ void
bus_space_copy_region_2(t, h1, o1, h2, o2, c)
bus_space_tag_t t;
bus_space_handle_t h1, h2;
bus_size_t o1, o2;
bus_size_t c;
{
for (; c; c--, o1+=2, o2+=2)
bus_space_write_2(t, h1, o1, bus_space_read_2(t, h2, o2));
}
extern __inline__ void
bus_space_copy_region_4(t, h1, o1, h2, o2, c)
bus_space_tag_t t;
bus_space_handle_t h1, h2;
bus_size_t o1, o2;
bus_size_t c;
{
for (; c; c--, o1+=4, o2+=4)
bus_space_write_4(t, h1, o1, bus_space_read_4(t, h2, o2));
}
extern __inline__ void
bus_space_copy_region_8(t, h1, o1, h2, o2, c)
bus_space_tag_t t;
bus_space_handle_t h1, h2;
bus_size_t o1, o2;
bus_size_t c;
{
for (; c; c--, o1+=8, o2+=8)
bus_space_write_8(t, h1, o1, bus_space_read_8(t, h2, o2));
}
#define bus_space_copy_region_8(t, h1, o1, h2, o2, c) \
{ int i = c; \
for (; i; i--, o1 += 8, o2 += 8) \
bus_space_write_8(t, h1, o1, bus_space_read_4(t, h2, o2)); \
} while (0)
#define BUS_SPACE_ALIGNED_POINTER(p, t) ALIGNED_POINTER(p, t)

View File

@ -1,4 +1,4 @@
/* $NetBSD: ctlreg.h,v 1.13 2000/04/10 16:05:13 mrg Exp $ */
/* $NetBSD: ctlreg.h,v 1.14 2000/06/02 22:56:33 eeh Exp $ */
/*
* Copyright (c) 1996-1999 Eduardo Horvath
@ -164,6 +164,9 @@
#define ASI_BLK_S ASI_BLOCK_SECONDARY
#define ASI_BLK_SL ASI_BLOCK_SECONDARY_LITTLE
#define PHYS_ASI(x) (((x) | 0x09) == 0x1d)
#define LITTLE_ASI(x) ((x) & ASI_LITTLE)
/*
* The following are 4u control registers
*/
@ -432,7 +435,7 @@
#ifdef DCACHE_BUG
#define lduba(loc, asi) ({ \
register int _lduba_v; \
if (asi == ASI_PHYS_CACHED) { \
if (PHYS_ASI(asi)) { \
__asm __volatile("wr %2,%%g0,%%asi; " \
" andn %1,0x1f,%0; stxa %%g0,[%0] %3; membar #Sync; " \
" lduba [%1]%%asi,%0" : "=&r" (_lduba_v) : \
@ -455,28 +458,33 @@
/* load byte from alternate address space */
#ifdef DCACHE_BUG
#define lduba(loc, asi) ({ \
register int _lduba_v, _loc_hi; \
register int _lduba_v, _loc_hi, _pstate; \
_loc_hi = (((u_int64_t)loc)>>32); \
if (asi == ASI_PHYS_CACHED) { \
__asm __volatile("wr %3,%%g0,%%asi; " \
" andn %1,0x1f,%0; stxa %%g0,[%0] %4; " \
" sllx %2,32,%0; or %0,%1,%0; membar #Sync; lduba [%0]%%asi,%0" : "=&r" (_lduba_v) : \
if (PHYS_ASI(asi)) { \
__asm __volatile("wr %4,%%g0,%%asi; " \
" andn %2,0x1f,%0; stxa %%g0,[%0] %5; rdpr %%pstate,%1; " \
" sllx %3,32,%0; or %0,%2,%0; wrpr %1,8,%%pstate; " \
" membar #Sync; lduba [%0]%%asi,%0; wrpr %1,0,%%pstate" : \
"=&r" (_lduba_v), "=&r" (_pstate) : \
"r" ((long)(loc)), "r" (_loc_hi), \
"r" (asi), "n" (ASI_DCACHE_TAG)); \
} else { \
__asm __volatile("wr %3,%%g0,%%asi; sllx %2,32,%0; " \
" or %0,%1,%0; lduba [%0]%%asi,%0" : "=&r" (_lduba_v) : \
__asm __volatile("wr %4,%%g0,%%asi; sllx %3,32,%0; " \
" rdpr %%pstate,%1; wrpr %1,8,%%pstate; " \
" or %0,%2,%0; lduba [%0]%%asi,%0; wrpr %1,0,%%pstate" : \
"=&r" (_lduba_v), "=&r" (_pstate) : \
"r" ((long)(loc)), "r" (_loc_hi), "r" (asi)); \
} \
_lduba_v; \
})
#else
#define lduba(loc, asi) ({ \
register int _lduba_v, _loc_hi; \
register int _lduba_v, _loc_hi, _pstate; \
_loc_hi = (((u_int64_t)loc)>>32); \
__asm __volatile("wr %3,%%g0,%%asi; sllx %2,32,%0; " \
" or %0,%1,%0; lduba [%0]%%asi,%0" : "=&r" (_lduba_v) : \
"r" ((long)(loc)), "r" (_loc_hi), "r" (asi)); \
__asm __volatile("wr %4,%%g0,%%asi; rdpr %%pstate,%1; sllx %3,32,%0; " \
" wrpr %1,8,%%pstate; or %0,%2,%0; lduba [%0]%%asi,%0; wrpr %1,0,%%pstate" : \
"=&r" (_lduba_v), "=&r" (_pstate) : \
"r" ((long)(loc)), "r" (_loc_hi), "r" (asi)); \
_lduba_v; \
})
#endif
@ -487,7 +495,7 @@
#ifdef DCACHE_BUG
#define lduha(loc, asi) ({ \
register int _lduha_v; \
if (asi == ASI_PHYS_CACHED) { \
if (PHYS_ASI(asi)) { \
__asm __volatile("wr %2,%%g0,%%asi; " \
" andn %1,0x1f,%0; stxa %%g0,[%0] %3; membar #Sync; " \
" lduha [%1]%%asi,%0" : "=&r" (_lduha_v) : \
@ -510,17 +518,20 @@
/* load half-word from alternate address space */
#ifdef DCACHE_BUG
#define lduha(loc, asi) ({ \
register int _lduha_v, _loc_hi; \
register int _lduha_v, _loc_hi, _pstate; \
_loc_hi = (((u_int64_t)loc)>>32); \
if (asi == ASI_PHYS_CACHED) { \
__asm __volatile("wr %3,%%g0,%%asi; " \
" andn %1,0x1f,%0; stxa %%g0,[%0] %4; " \
" sllx %2,32,%0; or %0,%1,%0; membar #Sync; lduha [%0]%%asi,%0" : "=&r" (_lduha_v) : \
if (PHYS_ASI(asi)) { \
__asm __volatile("wr %4,%%g0,%%asi; rdpr %%pstate,%1; " \
" andn %2,0x1f,%0; stxa %%g0,[%0] %5; wrpr %1,8,%%pstate; sllx %3,32,%0; " \
" or %0,%2,%0; membar #Sync; lduha [%0]%%asi,%0; wrpr %1,0,%%pstate" : \
"=&r" (_lduha_v), "=&r" (_pstate) : \
"r" ((long)(loc)), "r" (_loc_hi), \
"r" (asi), "n" (ASI_DCACHE_TAG)); \
} else { \
__asm __volatile("wr %3,%%g0,%%asi; sllx %2,32,%0; " \
" or %0,%1,%0; lduha [%0]%%asi,%0" : "=&r" (_lduha_v) : \
__asm __volatile("wr %4,%%g0,%%asi; rdpr %%pstate,%1; " \
" sllx %3,32,%0; wrpr %1,8,%%pstate; " \
" or %0,%2,%0; lduha [%0]%%asi,%0; wrpr %1,0,%%pstate" : \
"=&r" (_lduha_v), "=&r" (_pstate) : \
"r" ((long)(loc)), "r" (_loc_hi), "r" (asi)); \
} \
_lduha_v; \
@ -529,9 +540,10 @@
#define lduha(loc, asi) ({ \
register int _lduha_v, _loc_hi; \
_loc_hi = (((u_int64_t)loc)>>32); \
__asm __volatile("wr %3,%%g0,%%asi; sllx %2,32,%0; " \
" or %0,%1,%0; lduha [%0]%%asi,%0" : "=&r" (_lduha_v) : \
"r" ((long)(loc)), "r" (_loc_hi), "r" (asi)); \
__asm __volatile("wr %4,%%g0,%%asi; sllx %3,32,%0; rdpr %%pstate,%1; " \
" or %0,%2,%0; wrpr %1,8,%%pstate; lduha [%0]%%asi,%0; wrpr %1,0,%%pstate" : \
"=&r" (_lduha_v), "=&r" (_pstate) : \
"r" ((long)(loc)), "r" (_loc_hi), "r" (asi)); \
_lduha_v; \
})
#endif
@ -542,7 +554,7 @@
#ifdef DCACHE_BUG
#define lda(loc, asi) ({ \
register int _lda_v; \
if (asi == ASI_PHYS_CACHED) { \
if (PHYS_ASI(asi)) { \
__asm __volatile("wr %2,%%g0,%%asi; " \
" andn %1,0x1f,%0; stxa %%g0,[%0] %3; membar #Sync; " \
" lda [%1]%%asi,%0" : "=&r" (_lda_v) : \
@ -557,7 +569,7 @@
/* load signed int from alternate address space */
#define ldswa(loc, asi) ({ \
register int _lda_v; \
if (asi == ASI_PHYS_CACHED) { \
if (PHYS_ASI(asi)) { \
__asm __volatile("wr %2,%%g0,%%asi; " \
" andn %1,0x1f,%0; stxa %%g0,[%0] %3; membar #Sync; " \
" ldswa [%1]%%asi,%0" : "=&r" (_lda_v) : \
@ -587,17 +599,20 @@
/* load unsigned int from alternate address space */
#ifdef DCACHE_BUG
#define lda(loc, asi) ({ \
register int _lda_v, _loc_hi; \
register int _lda_v, _loc_hi, _pstate; \
_loc_hi = (((u_int64_t)loc)>>32); \
if (asi == ASI_PHYS_CACHED) { \
__asm __volatile("wr %3,%%g0,%%asi; " \
" andn %1,0x1f,%0; stxa %%g0,[%0] %4; " \
" sllx %2,32,%0; or %0,%1,%0; membar #Sync; lda [%1]%%asi,%0" : "=&r" (_lda_v) : \
if (PHYS_ASI(asi)) { \
__asm __volatile("wr %4,%%g0,%%asi; rdpr %%pstate,%1;" \
" andn %2,0x1f,%0; stxa %%g0,[%0] %5; wrpr %1,8,%%pstate; " \
" sllx %3,32,%0; or %0,%2,%0; membar #Sync;lda [%0]%%asi,%0; " \
" wrpr %1,0,%%pstate" : "=&r" (_lda_v), "=&r" (_pstate) : \
"r" ((long)(loc)), "r" (_loc_hi), \
"r" (asi), "n" (ASI_DCACHE_TAG)); \
} else { \
__asm __volatile("wr %3,%%g0,%%asi; sllx %2,32,%0; " \
" or %0,%1,%0; lda [%0]%%asi,%0" : "=&r" (_lda_v) : \
__asm __volatile("wr %4,%%g0,%%asi; rdpr %%pstate,%1;" \
" sllx %3,32,%0; wrpr %1,8,%%pstate;" \
" or %0,%2,%0; lda [%0]%%asi,%0; wrpr %1,0,%%pstate" : \
"=&r" (_lda_v), "=&r" (_pstate) : \
"r" ((long)(loc)), "r" (_loc_hi), "r" (asi)); \
} \
_lda_v; \
@ -605,37 +620,42 @@
/* load signed int from alternate address space */
#define ldswa(loc, asi) ({ \
register int _lda_v, _loc_hi; \
register int _lda_v, _loc_hi, _pstate; \
_loc_hi = (((u_int64_t)loc)>>32); \
if (asi == ASI_PHYS_CACHED) { \
__asm __volatile("wr %3,%%g0,%%asi; " \
" andn %1,0x1f,%0; stxa %%g0,[%0] %4; " \
" sllx %2,32,%0; or %0,%1,%0; membar #Sync; ldswa [%1]%%asi,%0" : "=&r" (_lda_v) : \
if (PHYS_ASI(asi)) { \
__asm __volatile("wr %4,%%g0,%%asi; rdpr %%pstate,%1;" \
" andn %2,0x1f,%0; stxa %%g0,[%0] %5; wrpr %1,8,%%pstate; sllx %3,32,%0;" \
" or %0,%2,%0; membar #Sync; ldswa [%0]%%asi,%0; wrpr %1,0,%pstate" : \
"=&r" (_lda_v), "=&r" (_pstate) : \
"r" ((long)(loc)), "r" (_loc_hi), \
"r" (asi), "n" (ASI_DCACHE_TAG)); \
} else { \
__asm __volatile("wr %3,%%g0,%%asi; sllx %2,32,%0; " \
" or %0,%1,%0; ldswa [%0]%%asi,%0" : "=&r" (_lda_v) : \
__asm __volatile("wr %4,%%g0,%%asi; sllx %3,32,%0;" \
" rdpr %%pstate,%1; wrpr %1,8,%%pstate;" \
" or %0,%2,%0; ldswa [%0]%%asi,%0; wrpr %1,0,%%pstate" : \
"=&r" (_lda_v), "=&r" (_pstate) : \
"r" ((long)(loc)), "r" (_loc_hi), "r" (asi)); \
} \
_lda_v; \
})
#else
#define lda(loc, asi) ({ \
register int _lda_v, _loc_hi; \
register int _lda_v, _loc_hi, _pstate; \
_loc_hi = (((u_int64_t)loc)>>32); \
__asm __volatile("wr %3,%%g0,%%asi; sllx %2,32,%0; " \
" or %0,%1,%0; lda [%0]%%asi,%0" : "=&r" (_lda_v) : \
"r" ((long)(loc)), "r" (_loc_hi), "r" (asi)); \
__asm __volatile("wr %4,%%g0,%%asi; sllx %3,32,%0; rdpr %%pstate,%1;" \
" wrpr %1,8,%%pstate; or %0,%2,%0; lda [%0]%%asi,%0; wrpr %1,0,%pstate" : \
"=&r" (_lda_v), "=&r" (_pstate) : \
"r" ((long)(loc)), "r" (_loc_hi), "r" (asi)); \
_lda_v; \
})
#define ldswa(loc, asi) ({ \
register int _lda_v, _loc_hi; \
register int _lda_v, _loc_hi, _pstate;; \
_loc_hi = (((u_int64_t)loc)>>32); \
__asm __volatile("wr %3,%%g0,%%asi; sllx %2,32,%0; " \
" or %0,%1,%0; ldswa [%0]%%asi,%0" : "=&r" (_lda_v) : \
"r" ((long)(loc)), "r" (_loc_hi), "r" (asi)); \
__asm __volatile("wr %4,%%g0,%%asi; sllx %3,32,%0; rdpr %%pstate,%1;" \
" wrpr %1,8,%%pstate; or %0,%2,%0; ldswa [%0]%%asi,%0; wrpr %1,0,%pstate" : \
"=&r" (_lda_v), "=&r" (_pstate) : \
"r" ((long)(loc)), "r" (_loc_hi), "r" (asi)); \
_lda_v; \
})
#endif
@ -647,7 +667,7 @@
/* load 64-bit int from alternate address space */
#define ldda(loc, asi) ({ \
register long long _lda_v; \
if (asi == ASI_PHYS_CACHED) { \
if (PHYS_ASI(asi)) { \
__asm __volatile("wr %2,%%g0,%%asi; " \
" andn %1,0x1f,%0; stxa %%g0,[%0] %3; membar #Sync; " \
" ldda [%1]%%asi,%0" : "=&r" (_lda_v) : \
@ -661,16 +681,18 @@
#else
/* load 64-bit int from alternate address space */
#define ldda(loc, asi) ({ \
register long long _lda_v, _loc_hi; \
register long long _lda_v, _loc_hi, _pstate; \
_loc_hi = (((u_int64_t)loc)>>32); \
if (asi == ASI_PHYS_CACHED) { \
__asm __volatile("wr %3,%%g0,%%asi; " \
" andn %1,0x1f,%0; stxa %%g0,[%0] %4; " \
" sllx %2,32,%0; or %0,%1,%0; membar #Sync; ldda [%0]%%asi,%0" : "=&r" (_lda_v) : \
if (PHYS_ASI(asi)) { \
__asm __volatile("wr %4,%%g0,%%asi; rdpr %%pstate,%1;" \
" andn %2,0x1f,%0; rdpr %%pstate,%1; stxa %%g0,[%0] %5; wrpr %1,8,%%pstate;" \
" sllx %3,32,%0; or %0,%2,%0; membar #Sync; ldda [%0]%%asi,%0; wrpr %1,0,%%pstate" :\
"=&r" (_lda_v), "=&r" (_pstate) : \
"r" ((long)(loc)), "r" (_loc_hi), "r" (asi), "n" (ASI_DCACHE_TAG)); \
} else { \
__asm __volatile("wr %3,%%g0,%%asi; sllx %2,32,%0; " \
" or %0,%1,%0; ldda [%0]%%asi,%0" : "=&r" (_lda_v) : \
__asm __volatile("wr %4,%%g0,%%asi; sllx %3,32,%0; " \
" rdpr %%pstate,%1; or %0,%2,%0; wrpr %1,8,%%pstate; ldda [%0]%%asi,%0;" \
" wrpr %1,0,%%pstate" : "=&r" (_lda_v), "=&r" (_pstate) : \
"r" ((long)(loc)), "r" (_loc_hi), "r" (asi)); \
} \
_lda_v; \
@ -681,7 +703,7 @@
/* native load 64-bit int from alternate address space w/64-bit compiler*/
#define ldxa(loc, asi) ({ \
register long _lda_v; \
if (asi == ASI_PHYS_CACHED) { \
if (PHYS_ASI(asi)) { \
__asm __volatile("wr %2,%%g0,%%asi; "\
" andn %1,0x1f,%0; stxa %%g0,[%0] %3; membar #Sync; " \
" ldxa [%1]%%asi,%0" : "=&r" (_lda_v) : \
@ -697,17 +719,18 @@
#define ldxa(loc, asi) ({ \
register long _ldxa_lo, _ldxa_hi, _loc_hi; \
_loc_hi = (((u_int64_t)loc)>>32); \
if (asi == ASI_PHYS_CACHED) { \
if (PHYS_ASI(asi)) { \
__asm __volatile("wr %4,%%g0,%%asi; " \
" andn %2,0x1f,%0; stxa %%g0,[%0] %5; " \
" sllx %3,32,%0; or %0,%2,%0; membar #Sync; ldxa [%0]%%asi,%0; " \
" srlx %0,32,%1; srl %0,0,%0" : \
" andn %2,0x1f,%0; rdpr %%pstate,%1; stxa %%g0,[%0] %5; " \
" sllx %3,32,%0; wrpr %1,8,%%pstate; or %0,%2,%0; membar #Sync; ldxa [%0]%%asi,%0; " \
" wrpr %1,0,%%pstate; srlx %0,32,%1; srl %0,0,%0" : \
"=&r" (_ldxa_lo), "=&r" (_ldxa_hi) : \
"r" ((long)(loc)), "r" (_loc_hi), \
"r" (asi), "n" (ASI_DCACHE_TAG)); \
} else { \
__asm __volatile("wr %4,%%g0,%%asi; sllx %3,32,%0; " \
" or %0,%2,%0; ldxa [%0]%%asi,%0; srlx %0,32,%1; srl %0,0,%0;" : \
" rdpr %%pstate,%1; or %0,%2,%0; wrpr %1,8,%%pstate; ldxa [%0]%%asi,%0; " \
" wrpr %1,0,%%pstate; srlx %0,32,%1; srl %0,0,%0;" : \
"=&r" (_ldxa_lo), "=&r" (_ldxa_hi) : \
"r" ((long)(loc)), "r" (_loc_hi), "r" (asi)); \
} \
@ -727,11 +750,12 @@
})
#else
#define ldda(loc, asi) ({ \
register long long _lda_v, _loc_hi; \
register long long _lda_v, _loc_hi, _pstate; \
_loc_hi = (((u_int64_t)loc)>>32); \
__asm __volatile("wr %3,%%g0,%%asi; sllx %2,32,%0; " \
" or %0,%1,%0; ldda [%0]%%asi,%0" : "=&r" (_lda_v) : \
"r" ((long)(loc)), "r" (_loc_hi), "r" (asi)); \
__asm __volatile("wr %4,%%g0,%%asi; sllx %3,32,%0; rdpr %%pstate,%1" \
" or %0,%2,%0; wrpr %1,8,%%pstate; ldda [%0]%%asi,%0; wrpr %1,0,%%pstate" : \
"=&r" (_lda_v), "=&r" (_pstate) : \
"r" ((long)(loc)), "r" (_loc_hi), "r" (asi)); \
_lda_v; \
})
#endif
@ -749,8 +773,9 @@
#define ldxa(loc, asi) ({ \
register long _ldxa_lo, _ldxa_hi, _loc_hi; \
_loc_hi = (((u_int64_t)loc)>>32); \
__asm __volatile("wr %4,%%g0,%%asi; sllx %2,32,%0; " \
" or %0,%1,%0; ldxa [%2]%%asi,%0; srlx %0,32,%1; srl %0,0,%0;" : \
__asm __volatile("wr %4,%%g0,%%asi; sllx %2,32,%0; rdpr %%pstate,%1" \
" or %0,%1,%0; wrpr %1,8,%%pstate; ldxa [%0]%%asi,%0; wrpr %1,0,%%pstate;" \
" srlx %0,32,%1; srl %0,0,%0;" : \
"=&r" (_ldxa_lo), "=&r" (_ldxa_hi) : \
"r" ((long)(loc)), "r" (_loc_hi), "r" (asi)); \
((((int64_t)_ldxa_hi)<<32)|_ldxa_lo); \
@ -767,11 +792,12 @@
})
#else
#define stba(loc, asi, value) ({ \
register int _loc_hi; \
register int _loc_hi, _pstate; \
_loc_hi = (((u_int64_t)loc)>>32); \
__asm __volatile("wr %4,%%g0,%%asi; sllx %3,32,%0; " \
" or %2,%0,%0; stba %1,[%0]%%asi" : "=&r" (_loc_hi) : \
"r" ((int)(value)), "r" ((long)(loc)), "r" (_loc_hi), "r" (asi)); \
__asm __volatile("wr %5,%%g0,%%asi; sllx %4,32,%0; rdpr %%pstate,%1;" \
" or %3,%0,%0; wrpr %1,8,%%pstate; stba %2,[%0]%%asi; wrpr %1,0,%%pstate" : \
"=&r" (_loc_hi), "=&r" (_pstate) : \
"r" ((int)(value)), "r" ((long)(loc)), "r" (_loc_hi), "r" (asi)); \
})
#endif
@ -783,11 +809,12 @@
})
#else
#define stha(loc, asi, value) ({ \
register int _loc_hi; \
register int _loc_hi, _pstate; \
_loc_hi = (((u_int64_t)loc)>>32); \
__asm __volatile("wr %4,%%g0,%%asi; sllx %3,32,%0; " \
" or %2,%0,%0; stha %1,[%0]%%asi" : "=&r" (_loc_hi) : \
"r" ((int)(value)), "r" ((long)(loc)), "r" (_loc_hi), "r" (asi)); \
__asm __volatile("wr %5,%%g0,%%asi; sllx %4,32,%0; rdpr %%pstate,%1;" \
" or %3,%0,%0; wrpr %1,8,%%pstate; stha %2,[%0]%%asi; wrpr %1,0,%%pstate" : \
"=&r" (_loc_hi), "=&r" (_pstate) : \
"r" ((int)(value)), "r" ((long)(loc)), "r" (_loc_hi), "r" (asi)); \
})
#endif
@ -799,11 +826,12 @@ __asm __volatile("wr %4,%%g0,%%asi; sllx %3,32,%0; " \
})
#else
#define sta(loc, asi, value) ({ \
register int _loc_hi; \
register int _loc_hi, _pstate; \
_loc_hi = (((u_int64_t)loc)>>32); \
__asm __volatile("wr %4,%%g0,%%asi; sllx %3,32,%0; " \
" or %2,%0,%0; sta %1,[%0]%%asi" : "=&r" (_loc_hi) : \
"r" ((int)(value)), "r" ((int)(loc)), "r" (_loc_hi), "r" (asi)); \
__asm __volatile("wr %5,%%g0,%%asi; sllx %4,32,%0; rdpr %%pstate,%1;" \
" or %3,%0,%0; wrpr %1,8,%%pstate; sta %2,[%0]%%asi; wrpr %1,0,%%pstate" : \
"=&r" (_loc_hi), "=&r" (_pstate) : \
"r" ((int)(value)), "r" ((int)(loc)), "r" (_loc_hi), "r" (asi)); \
})
#endif
@ -815,11 +843,12 @@ __asm __volatile("wr %4,%%g0,%%asi; sllx %3,32,%0; " \
})
#else
#define stda(loc, asi, value) ({ \
register int _loc_hi; \
register int _loc_hi, _pstate; \
_loc_hi = (((u_int64_t)loc)>>32); \
__asm __volatile("wr %4,%%g0,%%asi; sllx %3,32,%0; " \
" or %2,%0,%0; stda %1,[%0]%%asi" : "=&r" (_loc_hi) : \
"r" ((long long)(value)), "r" ((int)(loc)), "r" (_loc_hi), "r" (asi)); \
__asm __volatile("wr %5,%%g0,%%asi; sllx %4,32,%0; rdpr %%pstate,%1; " \
" or %3,%0,%0; wrpr %1,8,%%pstate; stda %2,[%0]%%asi; wrpr %1,0,%%pstate" : \
"=&r" (_loc_hi), "=&r" (_pstate) : \
"r" ((long long)(value)), "r" ((int)(loc)), "r" (_loc_hi), "r" (asi)); \
})
#endif
@ -834,10 +863,11 @@ __asm __volatile("wr %4,%%g0,%%asi; sllx %3,32,%0; " \
#define stxa(loc, asi, value) ({ \
int _stxa_lo, _stxa_hi, _loc_hi; \
_stxa_lo = value; _stxa_hi = ((u_int64_t)value)>>32; \
_loc_hi = (((u_int64_t)(long)loc)>>32); \
__asm __volatile("wr %6,%%g0,%%asi; sllx %3,32,%1; sllx %5,32,%0; " \
" or %1,%2,%1; or %0,%4,%0; stxa %1,[%0]%%asi" : \
"=&r" (_loc_hi), "=&r" (_stxa_hi) : \
_loc_hi = (((u_int64_t)(u_long)loc)>>32); \
__asm __volatile("wr %7,%%g0,%%asi; sllx %4,32,%1; sllx %6,32,%0; " \
" or %1,%3,%1; rdpr %%pstate,%3; or %0,%5,%0; wrpr %3,8,%%pstate; " \
" stxa %1,[%0]%%asi; wrpr %3,0,%%pstate" : \
"=&r" (_loc_hi), "=&r" (_stxa_hi), "=&r" ((int)(_stxa_lo)): \
"r" ((int)(_stxa_lo)), "r" ((int)(_stxa_hi)), \
"r" ((int)(loc)), "r" (_loc_hi), "r" (asi)); \
})

View File

@ -1,4 +1,4 @@
/* $NetBSD: machdep.c,v 1.62 2000/05/26 21:20:21 thorpej Exp $ */
/* $NetBSD: machdep.c,v 1.63 2000/06/02 22:56:32 eeh Exp $ */
/*-
* Copyright (c) 1996, 1997, 1998 The NetBSD Foundation, Inc.
@ -131,6 +131,7 @@
/* Our exported CPU info; we have only one for now. */
struct cpu_info cpu_info_store;
int bus_space_debug = 0;
vm_map_t exec_map = NULL;
vm_map_t mb_map = NULL;
@ -1219,26 +1220,20 @@ _bus_dmamap_sync(t, map, offset, len, ops)
*
* Actually a #Sync is expensive. We should optimize.
*/
switch (ops) {
case BUS_DMASYNC_PREREAD:
/* Flush any pending writes */
if ((ops & BUS_DMASYNC_PREREAD) || (ops & BUS_DMASYNC_PREWRITE)) {
/*
* Don't really need to do anything, but flush any pending
* writes anyway.
*/
__asm("membar #Sync" : );
break;
case BUS_DMASYNC_POSTREAD:
}
if (ops & BUS_DMASYNC_POSTREAD) {
/* Invalidate the vcache */
blast_vcache();
/* Maybe we should flush the I$? */
break;
case BUS_DMASYNC_PREWRITE:
/* Flush any pending writes */
__asm("membar #Sync" : );
break;
case BUS_DMASYNC_POSTWRITE:
/* Nothing to do */
break;
default:
__asm("membar #Sync" : );
printf("_bus_dmamap_sync: unknown sync op\n");
/* Maybe we should flush the I$? When we support LKMs.... */
}
if (ops & BUS_DMASYNC_POSTWRITE) {
/* Nothing to do. Handled by the bus controller. */
}
}
@ -1502,6 +1497,7 @@ static vaddr_t iobase = IODEV_BASE;
* out of IO mappings, config space will not be mapped in,
* rather it will be accessed through MMU bypass ASI accesses.
*/
if (flags & BUS_SPACE_MAP_LINEAR) return (-1);
*hp = (bus_space_handle_t)addr;
if (!vaddr) return (0);
/* FALLTHROUGH */
@ -1516,6 +1512,8 @@ static vaddr_t iobase = IODEV_BASE;
break;
}
if (!(flags & BUS_SPACE_MAP_CACHEABLE)) pm_flags |= PMAP_NC;
if (vaddr)
v = trunc_page(vaddr);
else {
@ -1532,12 +1530,13 @@ static vaddr_t iobase = IODEV_BASE;
#ifdef NOTDEF_DEBUG
printf("\nsparc_bus_map: type %x addr %016llx virt %llx paddr %016llx\n",
(int)iospace, (u_int64_t)addr, (u_int64_t)*hp, (u_int64_t)pa);
(int)iospace, (u_int64_t)addr, (u_int64_t)*hp, (u_int64_t)pa);
#endif
do {
#ifdef NOTDEF_DEBUG
printf("sparc_bus_map: phys %llx virt %p hp %llx\n", (u_int64_t)pa, (char *)v, (u_int64_t)*hp);
printf("sparc_bus_map: phys %llx virt %p hp %llx\n",
(u_int64_t)pa, (char *)v, (u_int64_t)*hp);
#endif
pmap_enter(pmap_kernel(), v, pa | pm_flags,
(flags&BUS_SPACE_MAP_READONLY) ? VM_PROT_READ