Hi,

> panic: trap type 0x34 (mem address not aligned): pc=15864ec
> npc=15864f0 pstate=99820006<PRIV,IE>
(snip)
> o...@eigenstate.org and I put together the following diff. I haven't been able
> to check with the original reporter, and I don't have a machine to test it on,
> so comments and/or tests would be appreciated!

Do you have a test case of this?

As far as I know, switch(4) assumes it receives packets located at 64
bit aligned memory.  So if the code like below

        *(uint64_t *)oxm->oxm_value = htobe64(val);

cause alignment faults, the assumption may be broken.  If so, the
place we should fix may not be here.


On Sun, 19 Aug 2018 14:28:06 -0700
Ayaka Koshibe <akosh...@openbsd.org> wrote:
> Hi,
> 
> At BSDCan, someone reported that a sparc64 machine would panic if it was
> receiving any traffic on a member interface of a switch(4) during reboot. We
> got as far as getting this trace:
> 
> panic: trap type 0x34 (mem address not aligned): pc=15864ec
> npc=15864f0 pstate=99820006<PRIV,IE>
> Stopped at      db_enter+0x8:   nop
>     TID    PID    UID     PRFLAGS     PFLAGS  CPU  COMMAND
>   22221  86809      0    0x100002          0    1  ld
>   22929    608     49    0x100012          0    8  switchd
> *136438  67954      0     0x14000      0x200    3K softnet
> trap(404f9b994f0, 34, 15864ec, 99820006, 14, 0) at trap+0x2e0
> Lslowtrap_reenter(4000d9c9b88, 4c, 1, 0, 4000d9c9b70, 0) at 
> Lslowtrap_reenter+0xf8
> swofp_action_output_controller(4000d135000, 4000d13d100, 4000c2db5e0, ffff, 
> 0, 3b9ac800) at swofp_action_output_controller+0x1f4
> swofp_action_output(4000d135000, 4000d425400, 4000c2db5e0, 4000cd300a8, 
> 4000c2db5e0, 6) at swofp_action_output+0x228
> swofp_execute_action(4000d135000, 4000d425400, 4000c2db5e0, 4000cd300a8, 0, 
> 1c289c0) at swofp_execute_action+0x34
> swofp_apply_actions(4000d135000, 4000d425400, 4000c2db5e0, 4000cd300a0, 
> 404f9b99ae8, 40079ac8000) at swofp_apply_actions+0x78
> swofp_forward_ofs(4000c2db5e0, 4000d0a0d40, 4000d425400, 0, 404f9b99ae8, 
> 40079ac8000) at swofp_forward_ofs+0xd8
> switch_process(4000d128000, 4000d425400, 0, 2, 4000d128590, 16c8710) at 
> switch_process+0x118
> switchintr(1cb5560, 3c4, 20, 0, 0, 6) at switchintr+0x94
> if_netisr(1c00, 404f9b99de0, 1c2ad38, 8000000, 40000000, 20000000) at 
> if_netisr+0x1f0
> taskq_thread(4000cd3c040, 4000cd04000, 17de528, 165f968, 0, 3b9ac800) at 
> taskq_thread+0x6c
> proc_trampoline(0, 0, 0, 0, 0, 0) at proc_trampoline+0x14
> 
> 
> o...@eigenstate.org and I put together the following diff. I haven't been able
> to check with the original reporter, and I don't have a machine to test it on,
> so comments and/or tests would be appreciated!
> 
> 
> Thanks,
> Ayaka
> 
> 
> Index: switchofp.c
> ===================================================================
> RCS file: /cvs/src/sys/net/switchofp.c,v
> retrieving revision 1.70
> diff -u -p -u -r1.70 switchofp.c
> --- switchofp.c       19 Feb 2018 08:59:52 -0000      1.70
> +++ switchofp.c       19 Jun 2018 04:14:04 -0000
> @@ -2455,12 +2455,12 @@ swofp_ox_match_put_uint32(struct ofp_mat
>       int      off = ntohs(om->om_length);
>       struct ofp_ox_match *oxm;
>  
> +     val = htonl(val);
>       oxm = (struct ofp_ox_match *)((caddr_t)om + off);
>       oxm->oxm_class = htons(OFP_OXM_C_OPENFLOW_BASIC);
>       OFP_OXM_SET_FIELD(oxm, type);
>       oxm->oxm_length = sizeof(uint32_t);
> -     *(uint32_t *)oxm->oxm_value = htonl(val);
> -
> +     memcpy(oxm->oxm_value, &val, sizeof(val));
>       om->om_length = htons(ntohs(om->om_length) +
>           sizeof(*oxm) + sizeof(uint32_t));
>  
> @@ -2473,12 +2473,12 @@ swofp_ox_match_put_uint64(struct ofp_mat
>       struct ofp_ox_match     *oxm;
>       int                      off = ntohs(om->om_length);
>  
> +     val = htobe64(val);
>       oxm = (struct ofp_ox_match *)((caddr_t)om + off);
>       oxm->oxm_class = htons(OFP_OXM_C_OPENFLOW_BASIC);
>       OFP_OXM_SET_FIELD(oxm, type);
>       oxm->oxm_length = sizeof(uint64_t);
> -     *(uint64_t *)oxm->oxm_value = htobe64(val);
> -
> +     memcpy(oxm->oxm_value, &val, sizeof(val));
>       om->om_length = htons(ntohs(om->om_length) +
>           sizeof(*oxm) + sizeof(uint64_t));
>  
> 

Reply via email to