Index: sbin/geom/class/eli/geom_eli.c =================================================================== --- sbin/geom/class/eli/geom_eli.c +++ sbin/geom/class/eli/geom_eli.c @@ -666,7 +666,11 @@ eli_init(struct gctl_req *req) { struct g_eli_metadata md; +#if defined(__mips_n64) || defined(__mips_o64) + unsigned char sector[sizeof(struct g_eli_metadata)] __aligned(4); +#else unsigned char sector[sizeof(struct g_eli_metadata)]; +#endif unsigned char key[G_ELI_USERKEYLEN]; char backfile[MAXPATHLEN]; const char *str, *prov; Index: sys/geom/eli/g_eli.h =================================================================== --- sys/geom/eli/g_eli.h +++ sys/geom/eli/g_eli.h @@ -291,6 +291,7 @@ { MD5_CTX ctx; u_char *p; + u_char hash[16] __aligned(4); p = data; bcopy(md->md_magic, p, sizeof(md->md_magic)); @@ -320,7 +321,8 @@ } MD5Init(&ctx); MD5Update(&ctx, data, p - data); - MD5Final(md->md_hash, &ctx); + MD5Final(hash, &ctx); + bcopy(hash, md->md_hash, sizeof(md->md_hash)); bcopy(md->md_hash, p, sizeof(md->md_hash)); } static __inline int @@ -328,6 +330,7 @@ { MD5_CTX ctx; const u_char *p; + u_char hash[16] __aligned(4); p = data + sizeof(md->md_magic) + sizeof(md->md_version); md->md_flags = le32dec(p); p += sizeof(md->md_flags); @@ -341,7 +344,8 @@ bcopy(p, md->md_mkeys, sizeof(md->md_mkeys)); p += sizeof(md->md_mkeys); MD5Init(&ctx); MD5Update(&ctx, data, p - data); - MD5Final(md->md_hash, &ctx); + MD5Final(hash, &ctx); + bcopy(hash, md->md_hash, sizeof(md->md_hash)); if (bcmp(md->md_hash, p, 16) != 0) return (EINVAL); return (0); @@ -352,6 +356,7 @@ { MD5_CTX ctx; const u_char *p; + u_char hash[16] __aligned(4); p = data + sizeof(md->md_magic) + sizeof(md->md_version); md->md_flags = le32dec(p); p += sizeof(md->md_flags); @@ -366,7 +371,8 @@ bcopy(p, md->md_mkeys, sizeof(md->md_mkeys)); p += sizeof(md->md_mkeys); MD5Init(&ctx); MD5Update(&ctx, data, p - data); - MD5Final(md->md_hash, &ctx); + MD5Final(hash, &ctx); + bcopy(hash, md->md_hash, sizeof(md->md_hash)); if (bcmp(md->md_hash, p, 16) != 0) return (EINVAL); return (0); Index: sys/geom/eli/g_eli_integrity.c =================================================================== --- sys/geom/eli/g_eli_integrity.c +++ sys/geom/eli/g_eli_integrity.c @@ -444,6 +444,9 @@ size += sizeof(*crde) * nsec; size += sizeof(*crda) * nsec; size += G_ELI_AUTH_SECKEYLEN * nsec; +#if defined(__mips_n64) || defined(__mips_o64) + size += sizeof(uintptr_t); /* Space for alignment. */ +#endif data = malloc(size, M_ELI, M_WAITOK); bp->bio_driver2 = data; p = data + encr_secsize * nsec; @@ -451,6 +454,10 @@ bp->bio_inbed = 0; bp->bio_children = nsec; +#if defined(__mips_n64) || defined(__mips_o64) + p = (char *)roundup((uintptr_t)p, sizeof(uintptr_t)); +#endif + for (i = 1; i <= nsec; i++, dstoff += encr_secsize) { crp = (struct cryptop *)p; p += sizeof(*crp); crde = (struct cryptodesc *)p; p += sizeof(*crde); Index: sys/modules/geom/Makefile =================================================================== --- sys/modules/geom/Makefile +++ sys/modules/geom/Makefile @@ -6,6 +6,7 @@ SUBDIR= geom_bde \ geom_cache \ geom_concat \ + geom_eli \ geom_gate \ geom_journal \ geom_label \ @@ -29,9 +30,4 @@ SUBDIR+= geom_ccd .endif -# Alignment issues in g_eli_auth_run() on MIPS64 causes kernel panic -.if ${MACHINE_ARCH} != "mips64" && ${MACHINE_ARCH} != "mips64el" -SUBDIR+= geom_eli -.endif - .include