Add bi-endian support to mips locore, <mips/endian.h>, and mips_opcode.h.

Derived from a change request (PR port-mips/4277) from
Tsubai Masanari, (tsubai@iri.co.jp).
This commit is contained in:
jonathan 1997-10-17 04:43:57 +00:00
parent 955c39c7ef
commit 22b3f9ebd8
5 changed files with 80 additions and 23 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: endian.h,v 1.9 1997/10/09 15:42:24 bouyer Exp $ */
/* $NetBSD: endian.h,v 1.10 1997/10/17 04:44:01 jonathan Exp $ */
/*
* Copyright (c) 1987, 1991, 1993
@ -35,8 +35,8 @@
* @(#)endian.h 8.1 (Berkeley) 6/11/93
*/
#ifndef _ENDIAN_H_
#define _ENDIAN_H_
#ifndef _MIPS_ENDIAN_H_
#define _MIPS_ENDIAN_H_
/*
* Define _NOQUAD if the compiler does NOT support 64-bit integers.
@ -58,7 +58,13 @@
#define BIG_ENDIAN 4321 /* MSB first: 68000, ibm, net */
#define PDP_ENDIAN 3412 /* LSB first in word, MSW first in long */
#define BYTE_ORDER LITTLE_ENDIAN
#ifndef BYTE_ORDER
# error Define MIPS target CPU endian-ness in port-specific header file
#endif
#ifndef _LOCORE
/* C-family endian-ness definitions */
#include <sys/cdefs.h>
#include <mips/types.h>
@ -90,12 +96,31 @@ __END_DECLS
#define HTONL(x) (x)
#define HTONS(x) (x)
#else
#else /* LITTLE_ENDIAN || !defined(lint) */
#define NTOHL(x) (x) = ntohl((in_addr_t)x)
#define NTOHS(x) (x) = ntohs((in_port_t)x)
#define HTONL(x) (x) = htonl((in_addr_t)x)
#define HTONS(x) (x) = htons((in_port_t)x)
#endif
#endif /* LITTLE_ENDIAN || !defined(lint) */
#else /* _LOCORE */
/* Assembly-code endian-independent aliases for unaligned memory accesses */
#if BYTE_ORDER == LITTLE_ENDIAN
# define LWHI lwr
# define LWLO lwl
# define SWHI swr
# define SWLO swl
#endif /* BYTE_ORDER == LITTLE_ENDIAN */
#if BYTE_ORDER == BIG_ENDIAN
# define LWHI lwl
# define LWLO lwr
# define SWHI swl
# define SWLO swr
#endif /* BYTE_ORDER == BIG_ENDIAN */
#endif /* _LOCORE */
#endif /* ! _POSIX_SOURCE */
#endif /* !_ENDIAN_H_ */
#endif /* !_MIPS_ENDIAN_H_ */

View File

@ -1,4 +1,4 @@
/* $NetBSD: mips_opcode.h,v 1.5 1996/03/23 18:49:29 jonathan Exp $ */
/* $NetBSD: mips_opcode.h,v 1.6 1997/10/17 04:43:57 jonathan Exp $ */
/*-
* Copyright (c) 1992, 1993
@ -81,6 +81,38 @@ typedef union {
unsigned op: 6; /* always '0x11' */
} FRType;
#endif
#if BYTE_ORDER == BIG_ENDIAN
struct {
unsigned op: 6;
unsigned rs: 5;
unsigned rt: 5;
unsigned imm: 16;
} IType;
struct {
unsigned op: 6;
unsigned target: 26;
} JType;
struct {
unsigned op: 6;
unsigned rs: 5;
unsigned rt: 5;
unsigned rd: 5;
unsigned shamt: 5;
unsigned func: 6;
} RType;
struct {
unsigned op: 6; /* always '0x11' */
unsigned : 1; /* always '1' */
unsigned fmt: 4;
unsigned ft: 5;
unsigned fs: 5;
unsigned fd: 5;
unsigned func: 6;
} FRType;
#endif
} InstFmt;
/*

View File

@ -1,4 +1,4 @@
/* $NetBSD: locore.S,v 1.45 1997/08/09 03:41:03 jonathan Exp $ */
/* $NetBSD: locore.S,v 1.46 1997/10/17 04:44:10 jonathan Exp $ */
/*
* Copyright (c) 1992, 1993
@ -89,6 +89,7 @@
#include <sys/errno.h>
#include <sys/syscall.h>
#include <machine/endian.h> /* byteorder for bcopy(), bzero(), byteswap */
#include <mips/cpuregs.h> /* XXX - misnomer ? */
#include <mips/regnum.h> /* XXX - ditto */
#include <mips/asm.h>
@ -259,6 +260,7 @@ END(__main)
* netorder = htonl(hostorder)
* hostorder = ntohl(netorder)
*/
#if BYTE_ORDER == LITTLE_ENDIAN
LEAF(htonl) # a0 = 0x11223344, return 0x44332211
ALEAF(ntohl)
srl v1, a0, 24 # v1 = 0x00000011
@ -286,6 +288,7 @@ ALEAF(ntohs)
j ra
or v0, v0, v1
END(htons)
#endif
/*
* strlen(str)
@ -335,7 +338,7 @@ LEAF(bzero)
and a3, a3, 3
beq a3, zero, 1f # skip if word aligned
subu a1, a1, a3 # subtract from remaining count
swr zero, 0(a0) # clear 1, 2, or 3 bytes to align
SWHI zero, 0(a0) # clear 1, 2, or 3 bytes to align
addu a0, a0, a3
1:
and v0, a1, 3 # compute number of words left
@ -372,8 +375,8 @@ LEAF(bcmp)
beq a3, zero, 1f
subu a2, a2, a3 # subtract from remaining count
move v0, v1 # init v0,v1 so unmodified bytes match
lwr v0, 0(a0) # read 1, 2, or 3 bytes
lwr v1, 0(a1)
LWHI v0, 0(a0) # read 1, 2, or 3 bytes
LWHI v1, 0(a1)
addu a1, a1, a3
bne v0, v1, nomatch
addu a0, a0, a3
@ -408,8 +411,8 @@ unalignedcmp:
subu a2, a2, a3 # which has to be >= (16-3) & ~3
addu a3, a3, a0 # compute ending address
3:
lwr v0, 0(a0) # compare words a0 unaligned, a1 aligned
lwl v0, 3(a0)
LWHI v0, 0(a0) # compare words a0 unaligned, a1 aligned
LWLO v0, 3(a0)
lw v1, 0(a1)
addu a0, a0, 4
bne v0, v1, nomatch
@ -552,13 +555,8 @@ destaligned:
addu a3,a0,a3 # stop point
3:
#if MIPSEL /* little-endian */
lwr v0,0(a0)
lwl v0,3(a0)
#else /* big-endian */
lwl v0,0(a0)
lwr v0,3(a0)
#endif
LWHI v0,0(a0)
LWLO v0,3(a0)
addi a0,4
sw v0,0(a1)
bne a0,a3,3b

View File

@ -1,3 +1,4 @@
/* $NetBSD: endian.h,v 1.2 1996/03/23 03:42:38 jonathan Exp $ */
/* $NetBSD: endian.h,v 1.3 1997/10/17 04:44:17 jonathan Exp $ */
#define BYTE_ORDER LITTLE_ENDIAN
#include <mips/endian.h>

View File

@ -1,3 +1,4 @@
/* $NetBSD: endian.h,v 1.5 1996/03/19 03:06:28 jonathan Exp $ */
/* $NetBSD: endian.h,v 1.6 1997/10/17 04:44:22 jonathan Exp $ */
#define BYTE_ORDER LITTLE_ENDIAN
#include <mips/endian.h>