From owner-svn-src-user@FreeBSD.ORG Sun Jul 4 01:39:59 2010 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 600981065674; Sun, 4 Jul 2010 01:39:59 +0000 (UTC) (envelope-from nwhitehorn@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 4FCC68FC08; Sun, 4 Jul 2010 01:39:59 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id o641dxDE085223; Sun, 4 Jul 2010 01:39:59 GMT (envelope-from nwhitehorn@svn.freebsd.org) Received: (from nwhitehorn@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o641dx3g085222; Sun, 4 Jul 2010 01:39:59 GMT (envelope-from nwhitehorn@svn.freebsd.org) Message-Id: <201007040139.o641dx3g085222@svn.freebsd.org> From: Nathan Whitehorn Date: Sun, 4 Jul 2010 01:39:59 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r209678 - user/nwhitehorn/ps3/powerpc/aim X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 04 Jul 2010 01:39:59 -0000 Author: nwhitehorn Date: Sun Jul 4 01:39:58 2010 New Revision: 209678 URL: http://svn.freebsd.org/changeset/base/209678 Log: Make static FDT inclusion work on PPC/aim. Modified: user/nwhitehorn/ps3/powerpc/aim/ofw_machdep.c Modified: user/nwhitehorn/ps3/powerpc/aim/ofw_machdep.c ============================================================================== --- user/nwhitehorn/ps3/powerpc/aim/ofw_machdep.c Sat Jul 3 22:02:29 2010 (r209677) +++ user/nwhitehorn/ps3/powerpc/aim/ofw_machdep.c Sun Jul 4 01:39:58 2010 (r209678) @@ -333,6 +333,12 @@ OF_initial_setup(void *fdt_ptr, void *ju #endif fdt = fdt_ptr; + +#ifdef FDT_DTB_STATIC + /* Check for a statically included blob */ + if (fdt == NULL) + fdt = &fdt_static_dtb; +#endif } boolean_t From owner-svn-src-user@FreeBSD.ORG Sun Jul 4 02:40:31 2010 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id B997E106566C; Sun, 4 Jul 2010 02:40:31 +0000 (UTC) (envelope-from nwhitehorn@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id A84DF8FC08; Sun, 4 Jul 2010 02:40:31 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id o642eVBV098464; Sun, 4 Jul 2010 02:40:31 GMT (envelope-from nwhitehorn@svn.freebsd.org) Received: (from nwhitehorn@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o642eVBq098460; Sun, 4 Jul 2010 02:40:31 GMT (envelope-from nwhitehorn@svn.freebsd.org) Message-Id: <201007040240.o642eVBq098460@svn.freebsd.org> From: Nathan Whitehorn Date: Sun, 4 Jul 2010 02:40:31 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r209679 - user/nwhitehorn/ps3/powerpc/ps3 X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 04 Jul 2010 02:40:31 -0000 Author: nwhitehorn Date: Sun Jul 4 02:40:31 2010 New Revision: 209679 URL: http://svn.freebsd.org/changeset/base/209679 Log: Generate the header and assembly files, modify hv-header.awk to generate correct prototypes for functions with no arguments, and add some useful constants. Added: user/nwhitehorn/ps3/powerpc/ps3/ps3-hvcall.S user/nwhitehorn/ps3/powerpc/ps3/ps3-hvcall.h Modified: user/nwhitehorn/ps3/powerpc/ps3/ps3-hv-header.awk user/nwhitehorn/ps3/powerpc/ps3/ps3-hvcall.master Modified: user/nwhitehorn/ps3/powerpc/ps3/ps3-hv-header.awk ============================================================================== --- user/nwhitehorn/ps3/powerpc/ps3/ps3-hv-header.awk Sun Jul 4 01:39:58 2010 (r209678) +++ user/nwhitehorn/ps3/powerpc/ps3/ps3-hv-header.awk Sun Jul 4 02:40:31 2010 (r209679) @@ -34,6 +34,9 @@ if (i < length(outs)) printf(", "); } + if (length(outs) == 0 && length(ins) == 0) + printf("void"); + printf(");\n"); } Added: user/nwhitehorn/ps3/powerpc/ps3/ps3-hvcall.S ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ user/nwhitehorn/ps3/powerpc/ps3/ps3-hvcall.S Sun Jul 4 02:40:31 2010 (r209679) @@ -0,0 +1,1208 @@ +#include + +#define hc .long 0x44000022 + +/* + * Playstation 3 LV1 hypercall interface + * + * $FreeBSD: user/nwhitehorn/ps3/powerpc/ps3/ps3-hvcall.master 209631 2010-07-01 15:23:29Z nwhitehorn $ + */ +ASENTRY(lv1_allocate_memory) + mflr %r0 + std %r0,16(%r1) + stdu %r1,-64(%r1) + std %r7,48(%r1) + std %r8,56(%r1) + li %r11,0 + hc + extsw %r3,%r3 + ld %r11,48(%r1) + std %r4,0(%r11) + ld %r11,56(%r1) + std %r5,0(%r11) + ld %r1,0(%r1) + ld %r0,16(%r1) + mtlr %r0 + blr + +ASENTRY(lv1_write_htab_entry) + mflr %r0 + std %r0,16(%r1) + stdu %r1,-48(%r1) + li %r11,1 + hc + extsw %r3,%r3 + ld %r1,0(%r1) + ld %r0,16(%r1) + mtlr %r0 + blr + +ASENTRY(lv1_construct_virtual_address_space) + mflr %r0 + std %r0,16(%r1) + stdu %r1,-64(%r1) + std %r6,48(%r1) + std %r7,56(%r1) + li %r11,2 + hc + extsw %r3,%r3 + ld %r11,48(%r1) + std %r4,0(%r11) + ld %r11,56(%r1) + std %r5,0(%r11) + ld %r1,0(%r1) + ld %r0,16(%r1) + mtlr %r0 + blr + +ASENTRY(lv1_get_virtual_address_space_id_of_ppe) + mflr %r0 + std %r0,16(%r1) + stdu %r1,-56(%r1) + std %r4,48(%r1) + li %r11,4 + hc + extsw %r3,%r3 + ld %r11,48(%r1) + std %r4,0(%r11) + ld %r1,0(%r1) + ld %r0,16(%r1) + mtlr %r0 + blr + +ASENTRY(lv1_query_logical_partition_address_region_info) + mflr %r0 + std %r0,16(%r1) + stdu %r1,-88(%r1) + std %r4,48(%r1) + std %r5,56(%r1) + std %r6,64(%r1) + std %r7,72(%r1) + std %r8,80(%r1) + li %r11,6 + hc + extsw %r3,%r3 + ld %r11,48(%r1) + std %r4,0(%r11) + ld %r11,56(%r1) + std %r5,0(%r11) + ld %r11,64(%r1) + std %r6,0(%r11) + ld %r11,72(%r1) + std %r7,0(%r11) + ld %r11,80(%r1) + std %r8,0(%r11) + ld %r1,0(%r1) + ld %r0,16(%r1) + mtlr %r0 + blr + +ASENTRY(lv1_select_virtual_address_space) + mflr %r0 + std %r0,16(%r1) + stdu %r1,-48(%r1) + li %r11,7 + hc + extsw %r3,%r3 + ld %r1,0(%r1) + ld %r0,16(%r1) + mtlr %r0 + blr + +ASENTRY(lv1_pause) + mflr %r0 + std %r0,16(%r1) + stdu %r1,-48(%r1) + li %r11,9 + hc + extsw %r3,%r3 + ld %r1,0(%r1) + ld %r0,16(%r1) + mtlr %r0 + blr + +ASENTRY(lv1_destruct_virtual_address_space) + mflr %r0 + std %r0,16(%r1) + stdu %r1,-48(%r1) + li %r11,10 + hc + extsw %r3,%r3 + ld %r1,0(%r1) + ld %r0,16(%r1) + mtlr %r0 + blr + +ASENTRY(lv1_configure_irq_state_bitmap) + mflr %r0 + std %r0,16(%r1) + stdu %r1,-48(%r1) + li %r11,11 + hc + extsw %r3,%r3 + ld %r1,0(%r1) + ld %r0,16(%r1) + mtlr %r0 + blr + +ASENTRY(lv1_connect_irq_plug_ext) + mflr %r0 + std %r0,16(%r1) + stdu %r1,-48(%r1) + li %r11,12 + hc + extsw %r3,%r3 + ld %r1,0(%r1) + ld %r0,16(%r1) + mtlr %r0 + blr + +ASENTRY(lv1_release_memory) + mflr %r0 + std %r0,16(%r1) + stdu %r1,-48(%r1) + li %r11,13 + hc + extsw %r3,%r3 + ld %r1,0(%r1) + ld %r0,16(%r1) + mtlr %r0 + blr + +ASENTRY(lv1_put_iopte) + mflr %r0 + std %r0,16(%r1) + stdu %r1,-48(%r1) + li %r11,15 + hc + extsw %r3,%r3 + ld %r1,0(%r1) + ld %r0,16(%r1) + mtlr %r0 + blr + +ASENTRY(lv1_disconnect_irq_plug_ext) + mflr %r0 + std %r0,16(%r1) + stdu %r1,-48(%r1) + li %r11,17 + hc + extsw %r3,%r3 + ld %r1,0(%r1) + ld %r0,16(%r1) + mtlr %r0 + blr + +ASENTRY(lv1_construct_event_receive_port) + mflr %r0 + std %r0,16(%r1) + stdu %r1,-56(%r1) + std %r3,48(%r1) + li %r11,18 + hc + extsw %r3,%r3 + ld %r11,48(%r1) + std %r4,0(%r11) + ld %r1,0(%r1) + ld %r0,16(%r1) + mtlr %r0 + blr + +ASENTRY(lv1_destruct_event_receive_port) + mflr %r0 + std %r0,16(%r1) + stdu %r1,-48(%r1) + li %r11,19 + hc + extsw %r3,%r3 + ld %r1,0(%r1) + ld %r0,16(%r1) + mtlr %r0 + blr + +ASENTRY(lv1_send_event_locally) + mflr %r0 + std %r0,16(%r1) + stdu %r1,-48(%r1) + li %r11,24 + hc + extsw %r3,%r3 + ld %r1,0(%r1) + ld %r0,16(%r1) + mtlr %r0 + blr + +ASENTRY(lv1_end_of_interrupt) + mflr %r0 + std %r0,16(%r1) + stdu %r1,-48(%r1) + li %r11,27 + hc + extsw %r3,%r3 + ld %r1,0(%r1) + ld %r0,16(%r1) + mtlr %r0 + blr + +ASENTRY(lv1_connect_irq_plug) + mflr %r0 + std %r0,16(%r1) + stdu %r1,-48(%r1) + li %r11,28 + hc + extsw %r3,%r3 + ld %r1,0(%r1) + ld %r0,16(%r1) + mtlr %r0 + blr + +ASENTRY(lv1_disconnect_irq_plus) + mflr %r0 + std %r0,16(%r1) + stdu %r1,-48(%r1) + li %r11,29 + hc + extsw %r3,%r3 + ld %r1,0(%r1) + ld %r0,16(%r1) + mtlr %r0 + blr + +ASENTRY(lv1_end_of_interrupt_ext) + mflr %r0 + std %r0,16(%r1) + stdu %r1,-48(%r1) + li %r11,30 + hc + extsw %r3,%r3 + ld %r1,0(%r1) + ld %r0,16(%r1) + mtlr %r0 + blr + +ASENTRY(lv1_did_update_interrupt_mask) + mflr %r0 + std %r0,16(%r1) + stdu %r1,-48(%r1) + li %r11,31 + hc + extsw %r3,%r3 + ld %r1,0(%r1) + ld %r0,16(%r1) + mtlr %r0 + blr + +ASENTRY(lv1_shutdown_logical_partition) + mflr %r0 + std %r0,16(%r1) + stdu %r1,-48(%r1) + li %r11,44 + hc + extsw %r3,%r3 + ld %r1,0(%r1) + ld %r0,16(%r1) + mtlr %r0 + blr + +ASENTRY(lv1_destruct_logical_spe) + mflr %r0 + std %r0,16(%r1) + stdu %r1,-48(%r1) + li %r11,54 + hc + extsw %r3,%r3 + ld %r1,0(%r1) + ld %r0,16(%r1) + mtlr %r0 + blr + +ASENTRY(lv1_construct_logical_spe) + mflr %r0 + std %r0,16(%r1) + stdu %r1,-96(%r1) + std %r10,48(%r1) + ld %r11,152(%r1) + std %r11,56(%r1) + ld %r11,160(%r1) + std %r11,64(%r1) + ld %r11,168(%r1) + std %r11,72(%r1) + ld %r11,176(%r1) + std %r11,80(%r1) + ld %r11,184(%r1) + std %r11,88(%r1) + li %r11,57 + hc + extsw %r3,%r3 + ld %r11,48(%r1) + std %r4,0(%r11) + ld %r11,56(%r1) + std %r5,0(%r11) + ld %r11,64(%r1) + std %r6,0(%r11) + ld %r11,72(%r1) + std %r7,0(%r11) + ld %r11,80(%r1) + std %r8,0(%r11) + ld %r11,88(%r1) + std %r9,0(%r11) + ld %r1,0(%r1) + ld %r0,16(%r1) + mtlr %r0 + blr + +ASENTRY(lv1_set_spe_interrupt_mask) + mflr %r0 + std %r0,16(%r1) + stdu %r1,-48(%r1) + li %r11,61 + hc + extsw %r3,%r3 + ld %r1,0(%r1) + ld %r0,16(%r1) + mtlr %r0 + blr + +ASENTRY(lv1_disable_logical_spe) + mflr %r0 + std %r0,16(%r1) + stdu %r1,-48(%r1) + li %r11,65 + hc + extsw %r3,%r3 + ld %r1,0(%r1) + ld %r0,16(%r1) + mtlr %r0 + blr + +ASENTRY(lv1_clear_spe_interrupt_status) + mflr %r0 + std %r0,16(%r1) + stdu %r1,-48(%r1) + li %r11,66 + hc + extsw %r3,%r3 + ld %r1,0(%r1) + ld %r0,16(%r1) + mtlr %r0 + blr + +ASENTRY(lv1_get_spe_interrupt_status) + mflr %r0 + std %r0,16(%r1) + stdu %r1,-56(%r1) + std %r5,48(%r1) + li %r11,67 + hc + extsw %r3,%r3 + ld %r11,48(%r1) + std %r4,0(%r11) + ld %r1,0(%r1) + ld %r0,16(%r1) + mtlr %r0 + blr + +ASENTRY(lv1_get_logical_ppe_id) + mflr %r0 + std %r0,16(%r1) + stdu %r1,-56(%r1) + std %r3,48(%r1) + li %r11,69 + hc + extsw %r3,%r3 + ld %r11,48(%r1) + std %r4,0(%r11) + ld %r1,0(%r1) + ld %r0,16(%r1) + mtlr %r0 + blr + +ASENTRY(lv1_get_logical_partition_id) + mflr %r0 + std %r0,16(%r1) + stdu %r1,-56(%r1) + std %r3,48(%r1) + li %r11,74 + hc + extsw %r3,%r3 + ld %r11,48(%r1) + std %r4,0(%r11) + ld %r1,0(%r1) + ld %r0,16(%r1) + mtlr %r0 + blr + +ASENTRY(lv1_get_spe_irq_outlet) + mflr %r0 + std %r0,16(%r1) + stdu %r1,-56(%r1) + std %r5,48(%r1) + li %r11,78 + hc + extsw %r3,%r3 + ld %r11,48(%r1) + std %r4,0(%r11) + ld %r1,0(%r1) + ld %r0,16(%r1) + mtlr %r0 + blr + +ASENTRY(lv1_set_spe_privilege_state_area_1_register) + mflr %r0 + std %r0,16(%r1) + stdu %r1,-48(%r1) + li %r11,79 + hc + extsw %r3,%r3 + ld %r1,0(%r1) + ld %r0,16(%r1) + mtlr %r0 + blr + +ASENTRY(lv1_get_repository_node_value) + mflr %r0 + std %r0,16(%r1) + stdu %r1,-64(%r1) + std %r8,48(%r1) + std %r9,56(%r1) + li %r11,91 + hc + extsw %r3,%r3 + ld %r11,48(%r1) + std %r4,0(%r11) + ld %r11,56(%r1) + std %r5,0(%r11) + ld %r1,0(%r1) + ld %r0,16(%r1) + mtlr %r0 + blr + +ASENTRY(lv1_set_dabr) + mflr %r0 + std %r0,16(%r1) + stdu %r1,-48(%r1) + li %r11,96 + hc + extsw %r3,%r3 + ld %r1,0(%r1) + ld %r0,16(%r1) + mtlr %r0 + blr + +ASENTRY(lv1_allocate_io_segment) + mflr %r0 + std %r0,16(%r1) + stdu %r1,-56(%r1) + std %r6,48(%r1) + li %r11,116 + hc + extsw %r3,%r3 + ld %r11,48(%r1) + std %r4,0(%r11) + ld %r1,0(%r1) + ld %r0,16(%r1) + mtlr %r0 + blr + +ASENTRY(lv1_release_io_segment) + mflr %r0 + std %r0,16(%r1) + stdu %r1,-48(%r1) + li %r11,117 + hc + extsw %r3,%r3 + ld %r1,0(%r1) + ld %r0,16(%r1) + mtlr %r0 + blr + +ASENTRY(lv1_construct_io_irq_outlet) + mflr %r0 + std %r0,16(%r1) + stdu %r1,-56(%r1) + std %r4,48(%r1) + li %r11,120 + hc + extsw %r3,%r3 + ld %r11,48(%r1) + std %r4,0(%r11) + ld %r1,0(%r1) + ld %r0,16(%r1) + mtlr %r0 + blr + +ASENTRY(lv1_destruct_io_irq_outlet) + mflr %r0 + std %r0,16(%r1) + stdu %r1,-48(%r1) + li %r11,121 + hc + extsw %r3,%r3 + ld %r1,0(%r1) + ld %r0,16(%r1) + mtlr %r0 + blr + +ASENTRY(lv1_map_htab) + mflr %r0 + std %r0,16(%r1) + stdu %r1,-56(%r1) + std %r4,48(%r1) + li %r11,122 + hc + extsw %r3,%r3 + ld %r11,48(%r1) + std %r4,0(%r11) + ld %r1,0(%r1) + ld %r0,16(%r1) + mtlr %r0 + blr + +ASENTRY(lv1_unmap_htab) + mflr %r0 + std %r0,16(%r1) + stdu %r1,-48(%r1) + li %r11,123 + hc + extsw %r3,%r3 + ld %r1,0(%r1) + ld %r0,16(%r1) + mtlr %r0 + blr + +ASENTRY(lv1_get_version_info) + mflr %r0 + std %r0,16(%r1) + stdu %r1,-56(%r1) + std %r3,48(%r1) + li %r11,127 + hc + extsw %r3,%r3 + ld %r11,48(%r1) + std %r4,0(%r11) + ld %r1,0(%r1) + ld %r0,16(%r1) + mtlr %r0 + blr + +ASENTRY(lv1_read_virtual_uart) + mflr %r0 + std %r0,16(%r1) + stdu %r1,-56(%r1) + std %r6,48(%r1) + li %r11,162 + hc + extsw %r3,%r3 + ld %r11,48(%r1) + std %r4,0(%r11) + ld %r1,0(%r1) + ld %r0,16(%r1) + mtlr %r0 + blr + +ASENTRY(lv1_write_virtual_uart) + mflr %r0 + std %r0,16(%r1) + stdu %r1,-56(%r1) + std %r6,48(%r1) + li %r11,163 + hc + extsw %r3,%r3 + ld %r11,48(%r1) + std %r4,0(%r11) + ld %r1,0(%r1) + ld %r0,16(%r1) + mtlr %r0 + blr + +ASENTRY(lv1_set_virtual_uart_param) + mflr %r0 + std %r0,16(%r1) + stdu %r1,-48(%r1) + li %r11,164 + hc + extsw %r3,%r3 + ld %r1,0(%r1) + ld %r0,16(%r1) + mtlr %r0 + blr + +ASENTRY(lv1_get_virtual_uart_param) + mflr %r0 + std %r0,16(%r1) + stdu %r1,-56(%r1) + std %r5,48(%r1) + li %r11,165 + hc + extsw %r3,%r3 + ld %r11,48(%r1) + std %r4,0(%r11) + ld %r1,0(%r1) + ld %r0,16(%r1) + mtlr %r0 + blr + +ASENTRY(lv1_configure_virtual_uart) + mflr %r0 + std %r0,16(%r1) + stdu %r1,-56(%r1) + std %r4,48(%r1) + li %r11,166 + hc + extsw %r3,%r3 + ld %r11,48(%r1) + std %r4,0(%r11) + ld %r1,0(%r1) + ld %r0,16(%r1) + mtlr %r0 + blr + +ASENTRY(lv1_open_device) + mflr %r0 + std %r0,16(%r1) + stdu %r1,-48(%r1) + li %r11,170 + hc + extsw %r3,%r3 + ld %r1,0(%r1) + ld %r0,16(%r1) + mtlr %r0 + blr + +ASENTRY(lv1_close_device) + mflr %r0 + std %r0,16(%r1) + stdu %r1,-48(%r1) + li %r11,171 + hc + extsw %r3,%r3 + ld %r1,0(%r1) + ld %r0,16(%r1) + mtlr %r0 + blr + +ASENTRY(lv1_map_device_mmio_region) + mflr %r0 + std %r0,16(%r1) + stdu %r1,-56(%r1) + std %r8,48(%r1) + li %r11,172 + hc + extsw %r3,%r3 + ld %r11,48(%r1) + std %r4,0(%r11) + ld %r1,0(%r1) + ld %r0,16(%r1) + mtlr %r0 + blr + +ASENTRY(lv1_unmap_device_mmio_region) + mflr %r0 + std %r0,16(%r1) + stdu %r1,-48(%r1) + li %r11,173 + hc + extsw %r3,%r3 + ld %r1,0(%r1) + ld %r0,16(%r1) + mtlr %r0 + blr + +ASENTRY(lv1_allocate_device_dma_region) + mflr %r0 + std %r0,16(%r1) + stdu %r1,-56(%r1) + std %r8,48(%r1) + li %r11,174 + hc + extsw %r3,%r3 + ld %r11,48(%r1) + std %r4,0(%r11) + ld %r1,0(%r1) + ld %r0,16(%r1) + mtlr %r0 + blr + +ASENTRY(lv1_free_device_dma_region) + mflr %r0 + std %r0,16(%r1) + stdu %r1,-48(%r1) + li %r11,175 + hc + extsw %r3,%r3 + ld %r1,0(%r1) + ld %r0,16(%r1) + mtlr %r0 + blr + +ASENTRY(lv1_map_device_dma_region) + mflr %r0 + std %r0,16(%r1) + stdu %r1,-48(%r1) + li %r11,176 + hc + extsw %r3,%r3 + ld %r1,0(%r1) + ld %r0,16(%r1) + mtlr %r0 + blr + +ASENTRY(lv1_unmap_device_dma_region) + mflr %r0 + std %r0,16(%r1) + stdu %r1,-48(%r1) + li %r11,177 + hc + extsw %r3,%r3 + ld %r1,0(%r1) + ld %r0,16(%r1) + mtlr %r0 + blr + +ASENTRY(lv1_read_pci_config) + mflr %r0 + std %r0,16(%r1) + stdu %r1,-56(%r1) + std %r9,48(%r1) + li %r11,178 + hc + extsw %r3,%r3 + ld %r11,48(%r1) + std %r4,0(%r11) + ld %r1,0(%r1) + ld %r0,16(%r1) + mtlr %r0 + blr + +ASENTRY(lv1_write_pci_config) + mflr %r0 + std %r0,16(%r1) + stdu %r1,-48(%r1) + li %r11,179 + hc + extsw %r3,%r3 + ld %r1,0(%r1) + ld %r0,16(%r1) + mtlr %r0 + blr + +ASENTRY(lv1_net_add_multicast_address) + mflr %r0 + std %r0,16(%r1) + stdu %r1,-48(%r1) + li %r11,185 + hc + extsw %r3,%r3 + ld %r1,0(%r1) + ld %r0,16(%r1) + mtlr %r0 + blr + +ASENTRY(lv1_net_remove_multicast_address) + mflr %r0 + std %r0,16(%r1) + stdu %r1,-48(%r1) + li %r11,186 + hc + extsw %r3,%r3 + ld %r1,0(%r1) + ld %r0,16(%r1) + mtlr %r0 + blr + +ASENTRY(lv1_net_start_tx_dma) + mflr %r0 + std %r0,16(%r1) + stdu %r1,-48(%r1) + li %r11,187 + hc + extsw %r3,%r3 + ld %r1,0(%r1) + ld %r0,16(%r1) + mtlr %r0 + blr + +ASENTRY(lv1_net_stop_tx_dma) + mflr %r0 + std %r0,16(%r1) + stdu %r1,-48(%r1) + li %r11,188 + hc + extsw %r3,%r3 + ld %r1,0(%r1) + ld %r0,16(%r1) + mtlr %r0 + blr + +ASENTRY(lv1_net_start_rx_dma) + mflr %r0 + std %r0,16(%r1) + stdu %r1,-48(%r1) + li %r11,189 + hc + extsw %r3,%r3 + ld %r1,0(%r1) + ld %r0,16(%r1) + mtlr %r0 + blr + +ASENTRY(lv1_net_stop_rx_dma) + mflr %r0 + std %r0,16(%r1) + stdu %r1,-48(%r1) + li %r11,190 + hc + extsw %r3,%r3 + ld %r1,0(%r1) + ld %r0,16(%r1) + mtlr %r0 + blr + +ASENTRY(lv1_net_set_interrupt_status_indicator) + mflr %r0 + std %r0,16(%r1) + stdu %r1,-48(%r1) + li %r11,191 + hc + extsw %r3,%r3 + ld %r1,0(%r1) + ld %r0,16(%r1) + mtlr %r0 + blr + +ASENTRY(lv1_net_set_interrupt_mask) + mflr %r0 + std %r0,16(%r1) + stdu %r1,-48(%r1) + li %r11,193 + hc + extsw %r3,%r3 + ld %r1,0(%r1) + ld %r0,16(%r1) + mtlr %r0 + blr + +ASENTRY(lv1_net_control) + mflr %r0 + std %r0,16(%r1) + stdu %r1,-64(%r1) + std %r9,48(%r1) + std %r10,56(%r1) + li %r11,194 + hc + extsw %r3,%r3 + ld %r11,48(%r1) + std %r4,0(%r11) + ld %r11,56(%r1) + std %r5,0(%r11) + ld %r1,0(%r1) + ld %r0,16(%r1) + mtlr %r0 + blr + +ASENTRY(lv1_connect_interrupt_event_receive_port) + mflr %r0 + std %r0,16(%r1) + stdu %r1,-48(%r1) + li %r11,197 + hc + extsw %r3,%r3 + ld %r1,0(%r1) + ld %r0,16(%r1) + mtlr %r0 + blr + +ASENTRY(lv1_disconnect_interrupt_event_receive_port) + mflr %r0 + std %r0,16(%r1) + stdu %r1,-48(%r1) + li %r11,198 + hc + extsw %r3,%r3 + ld %r1,0(%r1) + ld %r0,16(%r1) + mtlr %r0 + blr + +ASENTRY(lv1_deconfigure_virtual_uart_irq) + mflr %r0 + std %r0,16(%r1) + stdu %r1,-48(%r1) + li %r11,202 + hc + extsw %r3,%r3 + ld %r1,0(%r1) + ld %r0,16(%r1) + mtlr %r0 + blr + +ASENTRY(lv1_enable_logical_spe) + mflr %r0 + std %r0,16(%r1) + stdu %r1,-48(%r1) + li %r11,207 + hc + extsw %r3,%r3 + ld %r1,0(%r1) + ld %r0,16(%r1) + mtlr %r0 + blr + +ASENTRY(lv1_gpu_open) + mflr %r0 + std %r0,16(%r1) + stdu %r1,-48(%r1) + li %r11,210 + hc + extsw %r3,%r3 + ld %r1,0(%r1) + ld %r0,16(%r1) + mtlr %r0 + blr + +ASENTRY(lv1_gpu_close) + mflr %r0 + std %r0,16(%r1) + stdu %r1,-48(%r1) + li %r11,211 + hc + extsw %r3,%r3 + ld %r1,0(%r1) + ld %r0,16(%r1) + mtlr %r0 + blr + +ASENTRY(lv1_gpu_device_map) + mflr %r0 + std %r0,16(%r1) + stdu %r1,-64(%r1) + std %r4,48(%r1) + std %r5,56(%r1) + li %r11,212 + hc + extsw %r3,%r3 + ld %r11,48(%r1) + std %r4,0(%r11) *** DIFF OUTPUT TRUNCATED AT 1000 LINES *** From owner-svn-src-user@FreeBSD.ORG Sun Jul 4 02:42:01 2010 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id AED671065670; Sun, 4 Jul 2010 02:42:01 +0000 (UTC) (envelope-from nwhitehorn@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 9E8AF8FC08; Sun, 4 Jul 2010 02:42:01 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id o642g1Q6098825; Sun, 4 Jul 2010 02:42:01 GMT (envelope-from nwhitehorn@svn.freebsd.org) Received: (from nwhitehorn@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o642g1YH098823; Sun, 4 Jul 2010 02:42:01 GMT (envelope-from nwhitehorn@svn.freebsd.org) Message-Id: <201007040242.o642g1YH098823@svn.freebsd.org> From: Nathan Whitehorn Date: Sun, 4 Jul 2010 02:42:01 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r209680 - user/nwhitehorn/ps3/dev/ofw X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 04 Jul 2010 02:42:01 -0000 Author: nwhitehorn Date: Sun Jul 4 02:42:01 2010 New Revision: 209680 URL: http://svn.freebsd.org/changeset/base/209680 Log: OF modules should return phandles equal to -1 on error, not 0. FDT should be audited for this more thoroughly, but this keeps Powermac-related stuff from thinking it should attach for now. Modified: user/nwhitehorn/ps3/dev/ofw/ofw_fdt.c Modified: user/nwhitehorn/ps3/dev/ofw/ofw_fdt.c ============================================================================== --- user/nwhitehorn/ps3/dev/ofw/ofw_fdt.c Sun Jul 4 02:40:31 2010 (r209679) +++ user/nwhitehorn/ps3/dev/ofw/ofw_fdt.c Sun Jul 4 02:42:01 2010 (r209680) @@ -387,6 +387,8 @@ ofw_fdt_finddevice(ofw_t ofw, const char offset = fdt_path_offset(fdtp, device); p = (phandle_t)(uintptr_t)fdt_offset_ptr(fdtp, offset, sizeof(p)); + if (p == 0) + p = -1; return (p); } From owner-svn-src-user@FreeBSD.ORG Sun Jul 4 02:44:33 2010 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 6424D106564A; Sun, 4 Jul 2010 02:44:33 +0000 (UTC) (envelope-from nwhitehorn@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 50DDD8FC08; Sun, 4 Jul 2010 02:44:33 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id o642iWVw099400; Sun, 4 Jul 2010 02:44:33 GMT (envelope-from nwhitehorn@svn.freebsd.org) Received: (from nwhitehorn@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o642iWJM099391; Sun, 4 Jul 2010 02:44:32 GMT (envelope-from nwhitehorn@svn.freebsd.org) Message-Id: <201007040244.o642iWJM099391@svn.freebsd.org> From: Nathan Whitehorn Date: Sun, 4 Jul 2010 02:44:32 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r209681 - in user/nwhitehorn/ps3: boot/fdt/dts boot/powerpc/ps3 conf powerpc/aim powerpc/ps3 X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 04 Jul 2010 02:44:33 -0000 Author: nwhitehorn Date: Sun Jul 4 02:44:32 2010 New Revision: 209681 URL: http://svn.freebsd.org/changeset/base/209681 Log: Provide syscons and platform modules for the PS3. This gets a console up, message from KDB, and the whole init sequence up until it tries to init the MMU, which does not work because of the hypervisor. That is pending. Simple hypervisor calls (e.g. determining the amount of non-hotplug memory) work at this point as well. Because of my abject and total failure to get FDT behaving, FDT-related platform detection code is under an #if 0 for now, and everything is keyed off of setting the loader tunable hw.platform=ps3. Added: user/nwhitehorn/ps3/boot/fdt/dts/ps3.dts user/nwhitehorn/ps3/powerpc/ps3/platform_ps3.c user/nwhitehorn/ps3/powerpc/ps3/ps3_syscons.c - copied, changed from r209627, user/nwhitehorn/ps3/powerpc/ofw/ofw_syscons.c Modified: user/nwhitehorn/ps3/boot/powerpc/ps3/Makefile user/nwhitehorn/ps3/conf/files user/nwhitehorn/ps3/conf/files.powerpc64 user/nwhitehorn/ps3/conf/options.powerpc64 user/nwhitehorn/ps3/powerpc/aim/ofw_machdep.c Added: user/nwhitehorn/ps3/boot/fdt/dts/ps3.dts ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ user/nwhitehorn/ps3/boot/fdt/dts/ps3.dts Sun Jul 4 02:44:32 2010 (r209681) @@ -0,0 +1,16 @@ +/* + * Sony PS3 flattened device tree + * + * $FreeBSD$ + */ + +/dts-v1/; + +/ { + model = "SonyPS3"; + compatible = "sony,ps3"; + #size-cells = <2>; + #address-cells = <2>; + + chosen {}; +}; Modified: user/nwhitehorn/ps3/boot/powerpc/ps3/Makefile ============================================================================== --- user/nwhitehorn/ps3/boot/powerpc/ps3/Makefile Sun Jul 4 02:42:01 2010 (r209680) +++ user/nwhitehorn/ps3/boot/powerpc/ps3/Makefile Sun Jul 4 02:44:32 2010 (r209681) @@ -21,6 +21,7 @@ LOADER_NET_SUPPORT?= yes LOADER_NFS_SUPPORT?= yes LOADER_TFTP_SUPPORT?= no LOADER_GZIP_SUPPORT?= yes +LOADER_FDT_SUPPORT?= yes LOADER_BZIP2_SUPPORT?= no .if ${LOADER_DISK_SUPPORT} == "yes" @@ -50,6 +51,13 @@ CFLAGS+= -DLOADER_NFS_SUPPORT .if ${LOADER_TFTP_SUPPORT} == "yes" CFLAGS+= -DLOADER_TFTP_SUPPORT .endif +.if ${LOADER_FDT_SUPPORT} == "yes" +CFLAGS+= -I${.CURDIR}/../../fdt +CFLAGS+= -I${.OBJDIR}/../../fdt +CFLAGS+= -DLOADER_FDT_SUPPORT +LIBFDT= ${.OBJDIR}/../../fdt/libfdt.a +.endif + .if ${MK_FORTH} != "no" # Enable BootForth Modified: user/nwhitehorn/ps3/conf/files ============================================================================== --- user/nwhitehorn/ps3/conf/files Sun Jul 4 02:42:01 2010 (r209680) +++ user/nwhitehorn/ps3/conf/files Sun Jul 4 02:44:32 2010 (r209681) @@ -980,11 +980,7 @@ dev/ex/if_ex_pccard.c optional ex pccar dev/exca/exca.c optional cbb dev/fatm/if_fatm.c optional fatm pci dev/fb/splash.c optional splash -dev/fdt/fdt_common.c optional fdt -dev/fdt/fdt_pci.c optional fdt pci dev/fdt/fdt_static_dtb.S optional fdt fdt_dtb_static -dev/fdt/fdtbus.c optional fdt -dev/fdt/simplebus.c optional fdt dev/fe/if_fe.c optional fe dev/fe/if_fe_pccard.c optional fe pccard dev/firewire/firewire.c optional firewire Modified: user/nwhitehorn/ps3/conf/files.powerpc64 ============================================================================== --- user/nwhitehorn/ps3/conf/files.powerpc64 Sun Jul 4 02:42:01 2010 (r209680) +++ user/nwhitehorn/ps3/conf/files.powerpc64 Sun Jul 4 02:44:32 2010 (r209681) @@ -34,6 +34,7 @@ dev/ofw/ofw_bus_subr.c optional aim dev/ofw/ofw_console.c optional aim dev/ofw/ofw_disk.c optional ofwd aim dev/ofw/ofw_iicbus.c optional iicbus aim +dev/ofw/ofw_fdt.c optional fdt dev/powermac_nvram/powermac_nvram.c optional powermac_nvram powermac dev/scc/scc_bfe_macio.c optional scc powermac dev/sound/macio/aoa.c optional snd_davbus | snd_ai2s powermac @@ -50,6 +51,7 @@ libkern/ffs.c standard libkern/ffsl.c standard libkern/fls.c standard libkern/flsl.c standard +libkern/memchr.c standard libkern/memmove.c standard libkern/memset.c standard powerpc/aim/clock.c optional aim @@ -135,6 +137,9 @@ powerpc/powerpc/suswintr.c standard powerpc/powerpc/syncicache.c standard powerpc/powerpc/sys_machdep.c standard powerpc/powerpc/uio_machdep.c standard +powerpc/ps3/platform_ps3.c optional ps3 +powerpc/ps3/ps3_syscons.c optional ps3 +powerpc/ps3/ps3-hvcall.S optional ps3 compat/freebsd32/freebsd32_ioctl.c optional compat_freebsd32 compat/freebsd32/freebsd32_misc.c optional compat_freebsd32 Modified: user/nwhitehorn/ps3/conf/options.powerpc64 ============================================================================== --- user/nwhitehorn/ps3/conf/options.powerpc64 Sun Jul 4 02:42:01 2010 (r209680) +++ user/nwhitehorn/ps3/conf/options.powerpc64 Sun Jul 4 02:44:32 2010 (r209681) @@ -4,7 +4,6 @@ AIM opt_global.h E500 opt_global.h CELL -MAMBO COMPAT_FREEBSD32 opt_compat.h @@ -12,7 +11,9 @@ GFB_DEBUG opt_gfb.h GFB_NO_FONT_LOADING opt_gfb.h GFB_NO_MODE_CHANGE opt_gfb.h +MAMBO opt_platform.h POWERMAC opt_platform.h +PS3 opt_platform.h SC_OFWFB opt_ofwfb.h Modified: user/nwhitehorn/ps3/powerpc/aim/ofw_machdep.c ============================================================================== --- user/nwhitehorn/ps3/powerpc/aim/ofw_machdep.c Sun Jul 4 02:42:01 2010 (r209680) +++ user/nwhitehorn/ps3/powerpc/aim/ofw_machdep.c Sun Jul 4 02:44:32 2010 (r209681) @@ -368,6 +368,7 @@ OF_bootstrap() */ ofw_quiesce(); } else { + ofw_real_mode = TRUE; status = OF_install(OFW_FDT, 0); if (status != TRUE) Added: user/nwhitehorn/ps3/powerpc/ps3/platform_ps3.c ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ user/nwhitehorn/ps3/powerpc/ps3/platform_ps3.c Sun Jul 4 02:44:32 2010 (r209681) @@ -0,0 +1,185 @@ +/*- + * Copyright (c) 2010 Nathan Whitehorn + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD: user/nwhitehorn/ps3/powerpc/booke/platform_ps3.c 193492 2009-06-05 09:46:00Z raj $"); + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "platform_if.h" +#include "ps3-hvcall.h" + +static int ps3_probe(platform_t); +static int ps3_attach(platform_t); +static void ps3_mem_regions(platform_t, struct mem_region **phys, int *physsz, + struct mem_region **avail, int *availsz); +static u_long ps3_timebase_freq(platform_t, struct cpuref *cpuref); +static int ps3_smp_first_cpu(platform_t, struct cpuref *cpuref); +static int ps3_smp_next_cpu(platform_t, struct cpuref *cpuref); +static int ps3_smp_get_bsp(platform_t, struct cpuref *cpuref); +static int ps3_smp_start_cpu(platform_t, struct pcpu *cpu); + +static platform_method_t ps3_methods[] = { + PLATFORMMETHOD(platform_probe, ps3_probe), + PLATFORMMETHOD(platform_attach, ps3_attach), + PLATFORMMETHOD(platform_mem_regions, ps3_mem_regions), + PLATFORMMETHOD(platform_timebase_freq, ps3_timebase_freq), + + PLATFORMMETHOD(platform_smp_first_cpu, ps3_smp_first_cpu), + PLATFORMMETHOD(platform_smp_next_cpu, ps3_smp_next_cpu), + PLATFORMMETHOD(platform_smp_get_bsp, ps3_smp_get_bsp), + PLATFORMMETHOD(platform_smp_start_cpu, ps3_smp_start_cpu), + + { 0, 0 } +}; + +static platform_def_t ps3_platform = { + "ps3", + ps3_methods, + 0 +}; + +PLATFORM_DEF(ps3_platform); + +static int +ps3_probe(platform_t plat) +{ +#if 0 + phandle_t root; + char compatible[64]; + + root = OF_finddevice("/"); + + if (OF_getprop(root, "compatible", compatible, sizeof(compatible)) <= 0) + return (ENXIO); + + if (strncmp(compatible, "sony,ps3", sizeof(compatible)) == 0) + return (BUS_PROBE_SPECIFIC); + + return (ENXIO); +#else + return (BUS_PROBE_NOWILDCARD); +#endif +} + +static int +ps3_attach(platform_t plat) +{ + boothowto |= RB_VERBOSE; + + return (0); +} + +#define MEM_REGIONS 8 +static struct mem_region avail_regions[MEM_REGIONS]; + +void +ps3_mem_regions(platform_t plat, struct mem_region **phys, int *physsz, + struct mem_region **avail, int *availsz) +{ + uint64_t lpar_id, junk, ppe_id; + + avail_regions[0].mr_start = 0; + lv1_get_logical_partition_id(&lpar_id); + lv1_get_logical_ppe_id(&ppe_id); + lv1_get_repository_node_value(lpar_id, + lv1_repository_string("bi") >> 32, lv1_repository_string("pu"), + ppe_id, lv1_repository_string("rm_size"), + &avail_regions[0].mr_size, &junk); + + *phys = *avail = avail_regions; + *physsz = *availsz = 1; +} + +static u_long +ps3_timebase_freq(platform_t plat, struct cpuref *cpuref) +{ + uint64_t ticks, node_id, junk; + uint64_t lpar_id; + + lv1_get_logical_partition_id(&lpar_id); + lv1_get_repository_node_value(lpar_id, PS3_LPAR_ID_PME, + lv1_repository_string("be") >> 32, 0, 0, &node_id, &junk); + lv1_get_repository_node_value(lpar_id, PS3_LPAR_ID_PME, + lv1_repository_string("be") >> 32, node_id, + lv1_repository_string("clock"), &ticks, &junk); + + return (ticks); +} + +static int +ps3_smp_first_cpu(platform_t plat, struct cpuref *cpuref) +{ + + cpuref->cr_cpuid = 0; + cpuref->cr_hwref = cpuref->cr_cpuid; + + return (0); +} + +static int +ps3_smp_next_cpu(platform_t plat, struct cpuref *cpuref) +{ + + return (ENOENT); +} + +static int +ps3_smp_get_bsp(platform_t plat, struct cpuref *cpuref) +{ + + cpuref->cr_cpuid = 0; + cpuref->cr_hwref = cpuref->cr_cpuid; + + return (0); +} + +static int +ps3_smp_start_cpu(platform_t plat, struct pcpu *pc) +{ + + /* No SMP support */ + return (ENXIO); +} Copied and modified: user/nwhitehorn/ps3/powerpc/ps3/ps3_syscons.c (from r209627, user/nwhitehorn/ps3/powerpc/ofw/ofw_syscons.c) ============================================================================== --- user/nwhitehorn/ps3/powerpc/ofw/ofw_syscons.c Thu Jul 1 14:55:54 2010 (r209627, copy source) +++ user/nwhitehorn/ps3/powerpc/ps3/ps3_syscons.c Sun Jul 4 02:44:32 2010 (r209681) @@ -44,113 +44,110 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include #include #include -#include -#include -#include -#include - -static int ofwfb_ignore_mmap_checks = 1; -SYSCTL_NODE(_hw, OID_AUTO, ofwfb, CTLFLAG_RD, 0, "ofwfb"); -SYSCTL_INT(_hw_ofwfb, OID_AUTO, relax_mmap, CTLFLAG_RW, - &ofwfb_ignore_mmap_checks, 0, "relaxed mmap bounds checking"); - extern u_char dflt_font_16[]; extern u_char dflt_font_14[]; extern u_char dflt_font_8[]; -static int ofwfb_configure(int flags); +static int ps3fb_configure(int flags); + +static vi_probe_t ps3fb_probe; +static vi_init_t ps3fb_init; +static vi_get_info_t ps3fb_get_info; +static vi_query_mode_t ps3fb_query_mode; +static vi_set_mode_t ps3fb_set_mode; +static vi_save_font_t ps3fb_save_font; +static vi_load_font_t ps3fb_load_font; +static vi_show_font_t ps3fb_show_font; +static vi_save_palette_t ps3fb_save_palette; +static vi_load_palette_t ps3fb_load_palette; +static vi_set_border_t ps3fb_set_border; +static vi_save_state_t ps3fb_save_state; +static vi_load_state_t ps3fb_load_state; +static vi_set_win_org_t ps3fb_set_win_org; +static vi_read_hw_cursor_t ps3fb_read_hw_cursor; +static vi_set_hw_cursor_t ps3fb_set_hw_cursor; +static vi_set_hw_cursor_shape_t ps3fb_set_hw_cursor_shape; +static vi_blank_display_t ps3fb_blank_display; +static vi_mmap_t ps3fb_mmap; +static vi_ioctl_t ps3fb_ioctl; +static vi_clear_t ps3fb_clear; +static vi_fill_rect_t ps3fb_fill_rect; +static vi_bitblt_t ps3fb_bitblt; +static vi_diag_t ps3fb_diag; +static vi_save_cursor_palette_t ps3fb_save_cursor_palette; +static vi_load_cursor_palette_t ps3fb_load_cursor_palette; +static vi_copy_t ps3fb_copy; +static vi_putp_t ps3fb_putp; +static vi_putc_t ps3fb_putc; +static vi_puts_t ps3fb_puts; +static vi_putm_t ps3fb_putm; + +struct ps3fb_softc { + video_adapter_t sc_va; + struct cdev *sc_si; + int sc_console; + + intptr_t sc_addr; + int sc_height; + int sc_width; + int sc_stride; + int sc_ncol; + int sc_nrow; + + int sc_xmargin; + int sc_ymargin; -static vi_probe_t ofwfb_probe; -static vi_init_t ofwfb_init; -static vi_get_info_t ofwfb_get_info; -static vi_query_mode_t ofwfb_query_mode; -static vi_set_mode_t ofwfb_set_mode; -static vi_save_font_t ofwfb_save_font; -static vi_load_font_t ofwfb_load_font; -static vi_show_font_t ofwfb_show_font; -static vi_save_palette_t ofwfb_save_palette; -static vi_load_palette_t ofwfb_load_palette; -static vi_set_border_t ofwfb_set_border; -static vi_save_state_t ofwfb_save_state; -static vi_load_state_t ofwfb_load_state; -static vi_set_win_org_t ofwfb_set_win_org; -static vi_read_hw_cursor_t ofwfb_read_hw_cursor; -static vi_set_hw_cursor_t ofwfb_set_hw_cursor; -static vi_set_hw_cursor_shape_t ofwfb_set_hw_cursor_shape; -static vi_blank_display_t ofwfb_blank_display; -static vi_mmap_t ofwfb_mmap; -static vi_ioctl_t ofwfb_ioctl; -static vi_clear_t ofwfb_clear; -static vi_fill_rect_t ofwfb_fill_rect; -static vi_bitblt_t ofwfb_bitblt; -static vi_diag_t ofwfb_diag; -static vi_save_cursor_palette_t ofwfb_save_cursor_palette; -static vi_load_cursor_palette_t ofwfb_load_cursor_palette; -static vi_copy_t ofwfb_copy; -static vi_putp_t ofwfb_putp; -static vi_putc_t ofwfb_putc; -static vi_puts_t ofwfb_puts; -static vi_putm_t ofwfb_putm; - -static video_switch_t ofwfbvidsw = { - .probe = ofwfb_probe, - .init = ofwfb_init, - .get_info = ofwfb_get_info, - .query_mode = ofwfb_query_mode, - .set_mode = ofwfb_set_mode, - .save_font = ofwfb_save_font, - .load_font = ofwfb_load_font, - .show_font = ofwfb_show_font, - .save_palette = ofwfb_save_palette, - .load_palette = ofwfb_load_palette, - .set_border = ofwfb_set_border, - .save_state = ofwfb_save_state, - .load_state = ofwfb_load_state, - .set_win_org = ofwfb_set_win_org, - .read_hw_cursor = ofwfb_read_hw_cursor, - .set_hw_cursor = ofwfb_set_hw_cursor, - .set_hw_cursor_shape = ofwfb_set_hw_cursor_shape, - .blank_display = ofwfb_blank_display, - .mmap = ofwfb_mmap, - .ioctl = ofwfb_ioctl, - .clear = ofwfb_clear, - .fill_rect = ofwfb_fill_rect, - .bitblt = ofwfb_bitblt, - .diag = ofwfb_diag, - .save_cursor_palette = ofwfb_save_cursor_palette, - .load_cursor_palette = ofwfb_load_cursor_palette, - .copy = ofwfb_copy, - .putp = ofwfb_putp, - .putc = ofwfb_putc, - .puts = ofwfb_puts, - .putm = ofwfb_putm, + u_char *sc_font; + int sc_font_height; }; -/* - * bitmap depth-specific routines - */ -static vi_blank_display_t ofwfb_blank_display8; -static vi_putc_t ofwfb_putc8; -static vi_putm_t ofwfb_putm8; -static vi_set_border_t ofwfb_set_border8; - -static vi_blank_display_t ofwfb_blank_display32; -static vi_putc_t ofwfb_putc32; -static vi_putm_t ofwfb_putm32; -static vi_set_border_t ofwfb_set_border32; +static video_switch_t ps3fbvidsw = { + .probe = ps3fb_probe, + .init = ps3fb_init, + .get_info = ps3fb_get_info, + .query_mode = ps3fb_query_mode, + .set_mode = ps3fb_set_mode, + .save_font = ps3fb_save_font, + .load_font = ps3fb_load_font, + .show_font = ps3fb_show_font, + .save_palette = ps3fb_save_palette, + .load_palette = ps3fb_load_palette, + .set_border = ps3fb_set_border, + .save_state = ps3fb_save_state, + .load_state = ps3fb_load_state, + .set_win_org = ps3fb_set_win_org, + .read_hw_cursor = ps3fb_read_hw_cursor, + .set_hw_cursor = ps3fb_set_hw_cursor, + .set_hw_cursor_shape = ps3fb_set_hw_cursor_shape, + .blank_display = ps3fb_blank_display, + .mmap = ps3fb_mmap, + .ioctl = ps3fb_ioctl, + .clear = ps3fb_clear, + .fill_rect = ps3fb_fill_rect, + .bitblt = ps3fb_bitblt, + .diag = ps3fb_diag, + .save_cursor_palette = ps3fb_save_cursor_palette, + .load_cursor_palette = ps3fb_load_cursor_palette, + .copy = ps3fb_copy, + .putp = ps3fb_putp, + .putc = ps3fb_putc, + .puts = ps3fb_puts, + .putm = ps3fb_putm, +}; -VIDEO_DRIVER(ofwfb, ofwfbvidsw, ofwfb_configure); +VIDEO_DRIVER(ps3fb, ps3fbvidsw, ps3fb_configure); extern sc_rndr_sw_t txtrndrsw; -RENDERER(ofwfb, 0, txtrndrsw, gfb_set); +RENDERER(ps3fb, 0, txtrndrsw, gfb_set); -RENDERER_MODULE(ofwfb, gfb_set); +RENDERER_MODULE(ps3fb, gfb_set); /* * Define the iso6429-1983 colormap @@ -159,7 +156,7 @@ static struct { uint8_t red; uint8_t green; uint8_t blue; -} ofwfb_cmap[16] = { /* # R G B Color */ +} ps3fb_cmap[16] = { /* # R G B Color */ /* - - - - ----- */ { 0x00, 0x00, 0x00 }, /* 0 0 0 0 Black */ { 0x00, 0x00, 0xaa }, /* 1 0 0 2/3 Blue */ @@ -181,46 +178,44 @@ static struct { #define TODO printf("%s: unimplemented\n", __func__) -static u_int16_t ofwfb_static_window[ROW*COL]; +static u_int16_t ps3fb_static_window[ROW*COL]; -static struct ofwfb_softc ofwfb_softc; +static struct ps3fb_softc ps3fb_softc; static __inline int -ofwfb_background(uint8_t attr) +ps3fb_background(uint8_t attr) { return (attr >> 4); } static __inline int -ofwfb_foreground(uint8_t attr) +ps3fb_foreground(uint8_t attr) { return (attr & 0x0f); } static u_int -ofwfb_pix32(int attr) +ps3fb_pix32(int attr) { u_int retval; - retval = (ofwfb_cmap[attr].blue << 16) | - (ofwfb_cmap[attr].green << 8) | - ofwfb_cmap[attr].red; + retval = (ps3fb_cmap[attr].blue << 16) | + (ps3fb_cmap[attr].green << 8) | + ps3fb_cmap[attr].red; return (retval); } static int -ofwfb_configure(int flags) +ps3fb_configure(int flags) { - struct ofwfb_softc *sc; - phandle_t chosen; - ihandle_t stdout; - phandle_t node; - uint32_t fb_phys; - int depth; + struct ps3fb_softc *sc; + vm_offset_t fb_phys; int disable; - int len; - char type[16]; + char compatible[64]; +#if 0 + phandle_t root; +#endif static int done = 0; disable = 0; @@ -232,43 +227,27 @@ ofwfb_configure(int flags) return (0); done = 1; - sc = &ofwfb_softc; + sc = &ps3fb_softc; - chosen = OF_finddevice("/chosen"); - OF_getprop(chosen, "stdout", &stdout, sizeof(stdout)); - node = OF_instance_to_package(stdout); - if (node == -1) { - /* - * The "/chosen/stdout" does not exist try - * using "screen" directly. - */ - node = OF_finddevice("screen"); - } - OF_getprop(node, "device_type", type, sizeof(type)); - if (strcmp(type, "display") != 0) +#if 0 + root = OF_finddevice("/"); + if (OF_getprop(root, "compatible", compatible, sizeof(compatible)) <= 0) + return (0); + + if (strncmp(compatible, "sony,ps3", sizeof(compatible)) != 0) return (0); - - /* Only support 8 and 32-bit framebuffers */ - OF_getprop(node, "depth", &depth, sizeof(depth)); - if (depth == 8) { - sc->sc_blank = ofwfb_blank_display8; - sc->sc_putc = ofwfb_putc8; - sc->sc_putm = ofwfb_putm8; - sc->sc_set_border = ofwfb_set_border8; - } else if (depth == 32) { - sc->sc_blank = ofwfb_blank_display32; - sc->sc_putc = ofwfb_putc32; - sc->sc_putm = ofwfb_putm32; - sc->sc_set_border = ofwfb_set_border32; - } else +#else + TUNABLE_STR_FETCH("hw.platform", compatible, sizeof(compatible)); + if (strcmp(compatible, "ps3") != 0) return (0); +#endif - sc->sc_depth = depth; - sc->sc_node = node; sc->sc_console = 1; - OF_getprop(node, "height", &sc->sc_height, sizeof(sc->sc_height)); - OF_getprop(node, "width", &sc->sc_width, sizeof(sc->sc_width)); - OF_getprop(node, "linebytes", &sc->sc_stride, sizeof(sc->sc_stride)); + + /* XXX: get from HV repository */ + sc->sc_height = 480; + sc->sc_width = 720; + sc->sc_stride = sc->sc_width*4; /* * Grab the physical address of the framebuffer, and then map it @@ -277,51 +256,35 @@ ofwfb_configure(int flags) * * XXX We assume #address-cells is 1 at this point. */ - OF_getprop(node, "address", &fb_phys, sizeof(fb_phys)); + fb_phys = 0x10000000; bus_space_map(&bs_be_tag, fb_phys, sc->sc_height * sc->sc_stride, 0, &sc->sc_addr); - /* - * Get the PCI addresses of the adapter. The node may be the - * child of the PCI device: in that case, try the parent for - * the assigned-addresses property. - */ - len = OF_getprop(node, "assigned-addresses", sc->sc_pciaddrs, - sizeof(sc->sc_pciaddrs)); - if (len == -1) { - len = OF_getprop(OF_parent(node), "assigned-addresses", - sc->sc_pciaddrs, sizeof(sc->sc_pciaddrs)); - } - - if (len != -1) { - sc->sc_num_pciaddrs = len / sizeof(struct ofw_pci_register); - } - - ofwfb_init(0, &sc->sc_va, 0); + ps3fb_init(0, &sc->sc_va, 0); return (0); } static int -ofwfb_probe(int unit, video_adapter_t **adp, void *arg, int flags) +ps3fb_probe(int unit, video_adapter_t **adp, void *arg, int flags) { TODO; return (0); } static int -ofwfb_init(int unit, video_adapter_t *adp, int flags) +ps3fb_init(int unit, video_adapter_t *adp, int flags) { - struct ofwfb_softc *sc; + struct ps3fb_softc *sc; video_info_t *vi; - int cborder; + int cxborder, cyborder; int font_height; - sc = (struct ofwfb_softc *)adp; + sc = (struct ps3fb_softc *)adp; vi = &adp->va_info; - vid_init_struct(adp, "ofwfb", -1, unit); + vid_init_struct(adp, "ps3fb", -1, unit); /* The default font size can be overridden by loader */ font_height = 16; @@ -339,12 +302,14 @@ ofwfb_init(int unit, video_adapter_t *ad } /* The user can set a border in chars - default is 1 char width */ - cborder = 1; - TUNABLE_INT_FETCH("hw.syscons.border", &cborder); + cxborder = 8; + cyborder = 2; + TUNABLE_INT_FETCH("hw.syscons.xborder", &cxborder); + TUNABLE_INT_FETCH("hw.syscons.yborder", &cyborder); vi->vi_cheight = sc->sc_font_height; - vi->vi_width = sc->sc_width/8 - 2*cborder; - vi->vi_height = sc->sc_height/sc->sc_font_height - 2*cborder; + vi->vi_width = sc->sc_width/8 - 2*cxborder; + vi->vi_height = sc->sc_height/sc->sc_font_height - 2*cyborder; vi->vi_cwidth = 8; /* @@ -362,77 +327,52 @@ ofwfb_init(int unit, video_adapter_t *ad * Avoid huge amounts of conditional code in syscons by * defining a dummy h/w text display buffer. */ - adp->va_window = (vm_offset_t) ofwfb_static_window; + adp->va_window = (vm_offset_t) ps3fb_static_window; /* * Enable future font-loading and flag color support, as well as - * adding V_ADP_MODECHANGE so that we ofwfb_set_mode() gets called + * adding V_ADP_MODECHANGE so that we ps3fb_set_mode() gets called * when the X server shuts down. This enables us to get the console * back when X disappears. */ adp->va_flags |= V_ADP_FONT | V_ADP_COLOR | V_ADP_MODECHANGE; - ofwfb_set_mode(&sc->sc_va, 0); - + ps3fb_set_mode(&sc->sc_va, 0); vid_register(&sc->sc_va); return (0); } static int -ofwfb_get_info(video_adapter_t *adp, int mode, video_info_t *info) +ps3fb_get_info(video_adapter_t *adp, int mode, video_info_t *info) { bcopy(&adp->va_info, info, sizeof(*info)); return (0); } static int -ofwfb_query_mode(video_adapter_t *adp, video_info_t *info) +ps3fb_query_mode(video_adapter_t *adp, video_info_t *info) { TODO; return (0); } static int -ofwfb_set_mode(video_adapter_t *adp, int mode) +ps3fb_set_mode(video_adapter_t *adp, int mode) { - struct ofwfb_softc *sc; - char name[64]; - ihandle_t ih; - int i, retval; + struct ps3fb_softc *sc; - sc = (struct ofwfb_softc *)adp; + sc = (struct ps3fb_softc *)adp; - /* - * Open the display device, which will initialize it. - */ + /* XXX: no real mode setting at the moment */ - memset(name, 0, sizeof(name)); - OF_package_to_path(sc->sc_node, name, sizeof(name)); - ih = OF_open(name); - - if (sc->sc_depth == 8) { - /* - * Install the ISO6429 colormap - older OFW systems - * don't do this by default - */ - for (i = 0; i < 16; i++) { - OF_call_method("color!", ih, 4, 1, - ofwfb_cmap[i].red, - ofwfb_cmap[i].green, - ofwfb_cmap[i].blue, - i, - &retval); - } - } - - ofwfb_blank_display(&sc->sc_va, V_DISPLAY_ON); + ps3fb_blank_display(&sc->sc_va, V_DISPLAY_ON); return (0); } static int -ofwfb_save_font(video_adapter_t *adp, int page, int size, int width, +ps3fb_save_font(video_adapter_t *adp, int page, int size, int width, u_char *data, int c, int count) { TODO; @@ -440,12 +380,12 @@ ofwfb_save_font(video_adapter_t *adp, in } static int -ofwfb_load_font(video_adapter_t *adp, int page, int size, int width, +ps3fb_load_font(video_adapter_t *adp, int page, int size, int width, u_char *data, int c, int count) { - struct ofwfb_softc *sc; + struct ps3fb_softc *sc; - sc = (struct ofwfb_softc *)adp; + sc = (struct ps3fb_softc *)adp; /* * syscons code has already determined that current width/height @@ -456,109 +396,56 @@ ofwfb_load_font(video_adapter_t *adp, in } static int -ofwfb_show_font(video_adapter_t *adp, int page) +ps3fb_show_font(video_adapter_t *adp, int page) { return (0); } static int -ofwfb_save_palette(video_adapter_t *adp, u_char *palette) +ps3fb_save_palette(video_adapter_t *adp, u_char *palette) { /* TODO; */ return (0); } static int -ofwfb_load_palette(video_adapter_t *adp, u_char *palette) +ps3fb_load_palette(video_adapter_t *adp, u_char *palette) { /* TODO; */ return (0); } static int -ofwfb_set_border8(video_adapter_t *adp, int border) -{ - struct ofwfb_softc *sc; - int i, j; - uint8_t *addr; - uint8_t bground; - - sc = (struct ofwfb_softc *)adp; - - bground = ofwfb_background(border); - - /* Set top margin */ - addr = (uint8_t *) sc->sc_addr; - for (i = 0; i < sc->sc_ymargin; i++) { - for (j = 0; j < sc->sc_width; j++) { - *(addr + j) = bground; - } - addr += sc->sc_stride; - } - - /* bottom margin */ - addr = (uint8_t *) sc->sc_addr + (sc->sc_height - sc->sc_ymargin)*sc->sc_stride; - for (i = 0; i < sc->sc_ymargin; i++) { - for (j = 0; j < sc->sc_width; j++) { - *(addr + j) = bground; - } - addr += sc->sc_stride; - } - - /* remaining left and right borders */ - addr = (uint8_t *) sc->sc_addr + sc->sc_ymargin*sc->sc_stride; - for (i = 0; i < sc->sc_height - 2*sc->sc_xmargin; i++) { - for (j = 0; j < sc->sc_xmargin; j++) { - *(addr + j) = bground; - *(addr + j + sc->sc_width - sc->sc_xmargin) = bground; - } - addr += sc->sc_stride; - } - - return (0); -} - -static int -ofwfb_set_border32(video_adapter_t *adp, int border) +ps3fb_set_border(video_adapter_t *adp, int border) { /* XXX Be lazy for now and blank entire screen */ - return (ofwfb_blank_display32(adp, border)); + return (ps3fb_blank_display(adp, border)); } static int -ofwfb_set_border(video_adapter_t *adp, int border) -{ - struct ofwfb_softc *sc; - - sc = (struct ofwfb_softc *)adp; - - return ((*sc->sc_set_border)(adp, border)); -} - -static int -ofwfb_save_state(video_adapter_t *adp, void *p, size_t size) +ps3fb_save_state(video_adapter_t *adp, void *p, size_t size) { TODO; return (0); } static int -ofwfb_load_state(video_adapter_t *adp, void *p) +ps3fb_load_state(video_adapter_t *adp, void *p) { TODO; return (0); } static int -ofwfb_set_win_org(video_adapter_t *adp, off_t offset) +ps3fb_set_win_org(video_adapter_t *adp, off_t offset) { TODO; return (0); } static int -ofwfb_read_hw_cursor(video_adapter_t *adp, int *col, int *row) +ps3fb_read_hw_cursor(video_adapter_t *adp, int *col, int *row) { *col = 0; *row = 0; @@ -567,91 +454,42 @@ ofwfb_read_hw_cursor(video_adapter_t *ad } static int -ofwfb_set_hw_cursor(video_adapter_t *adp, int col, int row) +ps3fb_set_hw_cursor(video_adapter_t *adp, int col, int row) { return (0); } static int -ofwfb_set_hw_cursor_shape(video_adapter_t *adp, int base, int height, +ps3fb_set_hw_cursor_shape(video_adapter_t *adp, int base, int height, int celsize, int blink) { return (0); } static int -ofwfb_blank_display8(video_adapter_t *adp, int mode) +ps3fb_blank_display(video_adapter_t *adp, int mode) { - struct ofwfb_softc *sc; - int i; - uint8_t *addr; - - sc = (struct ofwfb_softc *)adp; - addr = (uint8_t *) sc->sc_addr; - - /* Could be done a lot faster e.g. 32-bits, or Altivec'd */ - for (i = 0; i < sc->sc_stride*sc->sc_height; i++) - *(addr + i) = ofwfb_background(SC_NORM_ATTR); - - return (0); -} - -static int -ofwfb_blank_display32(video_adapter_t *adp, int mode) -{ - struct ofwfb_softc *sc; + struct ps3fb_softc *sc; int i; uint32_t *addr; - sc = (struct ofwfb_softc *)adp; + sc = (struct ps3fb_softc *)adp; addr = (uint32_t *) sc->sc_addr; for (i = 0; i < (sc->sc_stride/4)*sc->sc_height; i++) - *(addr + i) = ofwfb_pix32(ofwfb_background(SC_NORM_ATTR)); + *(addr + i) = ps3fb_pix32(ps3fb_background(SC_NORM_ATTR)); return (0); } static int -ofwfb_blank_display(video_adapter_t *adp, int mode) -{ - struct ofwfb_softc *sc; *** DIFF OUTPUT TRUNCATED AT 1000 LINES *** From owner-svn-src-user@FreeBSD.ORG Sun Jul 4 17:37:28 2010 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id B292D106564A; Sun, 4 Jul 2010 17:37:28 +0000 (UTC) (envelope-from nwhitehorn@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id A0D368FC1A; Sun, 4 Jul 2010 17:37:28 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id o64HbS1b098416; Sun, 4 Jul 2010 17:37:28 GMT (envelope-from nwhitehorn@svn.freebsd.org) Received: (from nwhitehorn@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o64HbSlf098414; Sun, 4 Jul 2010 17:37:28 GMT (envelope-from nwhitehorn@svn.freebsd.org) Message-Id: <201007041737.o64HbSlf098414@svn.freebsd.org> From: Nathan Whitehorn Date: Sun, 4 Jul 2010 17:37:28 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r209696 - user/nwhitehorn/ps3/powerpc/powerpc X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 04 Jul 2010 17:37:28 -0000 Author: nwhitehorn Date: Sun Jul 4 17:37:28 2010 New Revision: 209696 URL: http://svn.freebsd.org/changeset/base/209696 Log: Allow multiple platform modules to peacefully coexist. Modified: user/nwhitehorn/ps3/powerpc/powerpc/platform.c Modified: user/nwhitehorn/ps3/powerpc/powerpc/platform.c ============================================================================== --- user/nwhitehorn/ps3/powerpc/powerpc/platform.c Sun Jul 4 12:43:12 2010 (r209695) +++ user/nwhitehorn/ps3/powerpc/powerpc/platform.c Sun Jul 4 17:37:28 2010 (r209696) @@ -154,9 +154,10 @@ platform_probe_and_attach() } /* - * We can't free the KOBJ, since it is static. Luckily, - * this has no ill effects since it gets reset every time. + * We can't free the KOBJ, since it is static. Reset the ops + * member of this class so that we can come back later. */ + platp->ops = NULL; } if (plat_def_impl == NULL) From owner-svn-src-user@FreeBSD.ORG Mon Jul 5 01:09:59 2010 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id AE297106566C; Mon, 5 Jul 2010 01:09:59 +0000 (UTC) (envelope-from nwhitehorn@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 9CADC8FC08; Mon, 5 Jul 2010 01:09:59 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id o6519xak099119; Mon, 5 Jul 2010 01:09:59 GMT (envelope-from nwhitehorn@svn.freebsd.org) Received: (from nwhitehorn@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o6519xIv099117; Mon, 5 Jul 2010 01:09:59 GMT (envelope-from nwhitehorn@svn.freebsd.org) Message-Id: <201007050109.o6519xIv099117@svn.freebsd.org> From: Nathan Whitehorn Date: Mon, 5 Jul 2010 01:09:59 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r209705 - in user/nwhitehorn/ps3/powerpc: aim include X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 05 Jul 2010 01:09:59 -0000 Author: nwhitehorn Date: Mon Jul 5 01:09:59 2010 New Revision: 209705 URL: http://svn.freebsd.org/changeset/base/209705 Log: Reorganize mmu_oea[64] slightly to allow hypervisor interface layers to provide page table manipulation hooks. This is done with if ... else instead of pointers to the native page table manipulation functions to preserve the inlining on the native routines. Added: user/nwhitehorn/ps3/powerpc/aim/mmu_oea64.h Modified: user/nwhitehorn/ps3/powerpc/aim/mmu_oea.c user/nwhitehorn/ps3/powerpc/aim/mmu_oea64.c user/nwhitehorn/ps3/powerpc/include/pmap.h Modified: user/nwhitehorn/ps3/powerpc/aim/mmu_oea.c ============================================================================== --- user/nwhitehorn/ps3/powerpc/aim/mmu_oea.c Sun Jul 4 22:17:56 2010 (r209704) +++ user/nwhitehorn/ps3/powerpc/aim/mmu_oea.c Mon Jul 5 01:09:59 2010 (r209705) @@ -161,24 +161,6 @@ __FBSDID("$FreeBSD$"); #define VSID_TO_SR(vsid) ((vsid) & 0xf) #define VSID_TO_HASH(vsid) (((vsid) >> 4) & 0xfffff) -#define PVO_PTEGIDX_MASK 0x007 /* which PTEG slot */ -#define PVO_PTEGIDX_VALID 0x008 /* slot is valid */ -#define PVO_WIRED 0x010 /* PVO entry is wired */ -#define PVO_MANAGED 0x020 /* PVO entry is managed */ -#define PVO_EXECUTABLE 0x040 /* PVO entry is executable */ -#define PVO_BOOTSTRAP 0x080 /* PVO entry allocated during - bootstrap */ -#define PVO_FAKE 0x100 /* fictitious phys page */ -#define PVO_VADDR(pvo) ((pvo)->pvo_vaddr & ~ADDR_POFF) -#define PVO_ISEXECUTABLE(pvo) ((pvo)->pvo_vaddr & PVO_EXECUTABLE) -#define PVO_ISFAKE(pvo) ((pvo)->pvo_vaddr & PVO_FAKE) -#define PVO_PTEGIDX_GET(pvo) ((pvo)->pvo_vaddr & PVO_PTEGIDX_MASK) -#define PVO_PTEGIDX_ISSET(pvo) ((pvo)->pvo_vaddr & PVO_PTEGIDX_VALID) -#define PVO_PTEGIDX_CLR(pvo) \ - ((void)((pvo)->pvo_vaddr &= ~(PVO_PTEGIDX_VALID|PVO_PTEGIDX_MASK))) -#define PVO_PTEGIDX_SET(pvo, i) \ - ((void)((pvo)->pvo_vaddr |= (i)|PVO_PTEGIDX_VALID)) - #define MOEA_PVO_CHECK(pvo) struct ofw_map { Modified: user/nwhitehorn/ps3/powerpc/aim/mmu_oea64.c ============================================================================== --- user/nwhitehorn/ps3/powerpc/aim/mmu_oea64.c Sun Jul 4 22:17:56 2010 (r209704) +++ user/nwhitehorn/ps3/powerpc/aim/mmu_oea64.c Mon Jul 5 01:09:59 2010 (r209705) @@ -155,6 +155,7 @@ __FBSDID("$FreeBSD$"); #include #include +#include "mmu_oea64.h" #include "mmu_if.h" #define MOEA_DEBUG @@ -235,24 +236,6 @@ TLBIE(uint64_t vpn) { #define VSID_TO_HASH(vsid) (((vsid) >> 4) & 0xfffff) #define VSID_HASH_MASK 0x0000007fffffffffULL -#define PVO_PTEGIDX_MASK 0x007UL /* which PTEG slot */ -#define PVO_PTEGIDX_VALID 0x008UL /* slot is valid */ -#define PVO_WIRED 0x010UL /* PVO entry is wired */ -#define PVO_MANAGED 0x020UL /* PVO entry is managed */ -#define PVO_BOOTSTRAP 0x080UL /* PVO entry allocated during - bootstrap */ -#define PVO_FAKE 0x100UL /* fictitious phys page */ -#define PVO_LARGE 0x200UL /* large page */ -#define PVO_VADDR(pvo) ((pvo)->pvo_vaddr & ~ADDR_POFF) -#define PVO_ISFAKE(pvo) ((pvo)->pvo_vaddr & PVO_FAKE) -#define PVO_PTEGIDX_GET(pvo) ((pvo)->pvo_vaddr & PVO_PTEGIDX_MASK) -#define PVO_PTEGIDX_ISSET(pvo) ((pvo)->pvo_vaddr & PVO_PTEGIDX_VALID) -#define PVO_PTEGIDX_CLR(pvo) \ - ((void)((pvo)->pvo_vaddr &= ~(PVO_PTEGIDX_VALID|PVO_PTEGIDX_MASK))) -#define PVO_PTEGIDX_SET(pvo, i) \ - ((void)((pvo)->pvo_vaddr |= (i)|PVO_PTEGIDX_VALID)) -#define PVO_VSID(pvo) ((pvo)->pvo_vpn >> 16) - #define MOEA_PVO_CHECK(pvo) #define LOCK_TABLE() mtx_lock(&moea64_table_mutex) @@ -280,7 +263,6 @@ extern struct pmap ofw_pmap; extern void bs_remap_earlyboot(void); - /* * Lock for the pteg and pvo tables. */ @@ -351,14 +333,22 @@ int moea64_large_page_size = 0; int moea64_large_page_shift = 0; /* - * Allocate physical memory for use in moea64_bootstrap. + * Hypervisor Hooks */ -static vm_offset_t moea64_bootstrap_alloc(vm_size_t, u_int); +void (*moea64_pte_synch_hook)(struct lpte *pt, struct lpte *pvo_pt) = NULL; +void (*moea64_pte_clear_hook)(struct lpte *pt, struct lpte *pvo_pt, + uint64_t vpn, u_int64_t ptebit) = NULL; +void (*moea64_pte_unset_hook)(struct lpte *pt, struct lpte *pvo_pt, + uint64_t vpn) = NULL; +void (*moea64_pte_change_hook)(struct lpte *pt, struct lpte *pvo_pt, + uint64_t vpn) = NULL; +int (*moea64_pte_insert_hook)(u_int ptegidx, struct lpte *pvo_pt) = NULL; +struct lpte *(*moea64_pvo_to_pte_hook)(const struct pvo_entry *pvo) = NULL; /* * PTE calls. */ -static int moea64_pte_insert(u_int, struct lpte *); +static int moea64_pte_insert_native(u_int, struct lpte *); /* * PVO calls. @@ -367,12 +357,12 @@ static int moea64_pvo_enter(pmap_t, uma_ vm_offset_t, vm_offset_t, uint64_t, int); static void moea64_pvo_remove(struct pvo_entry *); static struct pvo_entry *moea64_pvo_find_va(pmap_t, vm_offset_t); -static struct lpte *moea64_pvo_to_pte(const struct pvo_entry *); +static struct lpte *moea64_pvo_to_pte_native(const struct pvo_entry *); /* * Utility routines. */ -static void moea64_bootstrap(mmu_t mmup, +static void moea64_bootstrap_native(mmu_t mmup, vm_offset_t kernelstart, vm_offset_t kernelend); static void moea64_cpu_bootstrap(mmu_t, int ap); static void moea64_enter_locked(pmap_t, vm_offset_t, vm_page_t, @@ -390,43 +380,6 @@ static void slbia(void); /* * Kernel MMU interface */ -void moea64_change_wiring(mmu_t, pmap_t, vm_offset_t, boolean_t); -void moea64_clear_modify(mmu_t, vm_page_t); -void moea64_clear_reference(mmu_t, vm_page_t); -void moea64_copy_page(mmu_t, vm_page_t, vm_page_t); -void moea64_enter(mmu_t, pmap_t, vm_offset_t, vm_page_t, vm_prot_t, boolean_t); -void moea64_enter_object(mmu_t, pmap_t, vm_offset_t, vm_offset_t, vm_page_t, - vm_prot_t); -void moea64_enter_quick(mmu_t, pmap_t, vm_offset_t, vm_page_t, vm_prot_t); -vm_paddr_t moea64_extract(mmu_t, pmap_t, vm_offset_t); -vm_page_t moea64_extract_and_hold(mmu_t, pmap_t, vm_offset_t, vm_prot_t); -void moea64_init(mmu_t); -boolean_t moea64_is_modified(mmu_t, vm_page_t); -boolean_t moea64_is_referenced(mmu_t, vm_page_t); -boolean_t moea64_ts_referenced(mmu_t, vm_page_t); -vm_offset_t moea64_map(mmu_t, vm_offset_t *, vm_offset_t, vm_offset_t, int); -boolean_t moea64_page_exists_quick(mmu_t, pmap_t, vm_page_t); -int moea64_page_wired_mappings(mmu_t, vm_page_t); -void moea64_pinit(mmu_t, pmap_t); -void moea64_pinit0(mmu_t, pmap_t); -void moea64_protect(mmu_t, pmap_t, vm_offset_t, vm_offset_t, vm_prot_t); -void moea64_qenter(mmu_t, vm_offset_t, vm_page_t *, int); -void moea64_qremove(mmu_t, vm_offset_t, int); -void moea64_release(mmu_t, pmap_t); -void moea64_remove(mmu_t, pmap_t, vm_offset_t, vm_offset_t); -void moea64_remove_all(mmu_t, vm_page_t); -void moea64_remove_write(mmu_t, vm_page_t); -void moea64_zero_page(mmu_t, vm_page_t); -void moea64_zero_page_area(mmu_t, vm_page_t, int, int); -void moea64_zero_page_idle(mmu_t, vm_page_t); -void moea64_activate(mmu_t, struct thread *); -void moea64_deactivate(mmu_t, struct thread *); -void *moea64_mapdev(mmu_t, vm_offset_t, vm_size_t); -void moea64_unmapdev(mmu_t, vm_offset_t, vm_size_t); -vm_offset_t moea64_kextract(mmu_t, vm_offset_t); -void moea64_kenter(mmu_t, vm_offset_t, vm_offset_t); -boolean_t moea64_dev_direct_mapped(mmu_t, vm_offset_t, vm_size_t); -static void moea64_sync_icache(mmu_t, pmap_t, vm_offset_t, vm_size_t); static mmu_method_t moea64_methods[] = { MMUMETHOD(mmu_change_wiring, moea64_change_wiring), @@ -462,7 +415,7 @@ static mmu_method_t moea64_methods[] = { MMUMETHOD(mmu_deactivate, moea64_deactivate), /* Internal interfaces */ - MMUMETHOD(mmu_bootstrap, moea64_bootstrap), + MMUMETHOD(mmu_bootstrap, moea64_bootstrap_native), MMUMETHOD(mmu_cpu_bootstrap, moea64_cpu_bootstrap), MMUMETHOD(mmu_mapdev, moea64_mapdev), MMUMETHOD(mmu_unmapdev, moea64_unmapdev), @@ -561,7 +514,7 @@ moea64_pte_create(struct lpte *pt, uint6 } static __inline void -moea64_pte_synch(struct lpte *pt, struct lpte *pvo_pt) +moea64_pte_synch_native(struct lpte *pt, struct lpte *pvo_pt) { ASSERT_TABLE_LOCK(); @@ -570,7 +523,7 @@ moea64_pte_synch(struct lpte *pt, struct } static __inline void -moea64_pte_clear(struct lpte *pt, uint64_t vpn, u_int64_t ptebit) +moea64_pte_clear_native(struct lpte *pt, uint64_t vpn, u_int64_t ptebit) { ASSERT_TABLE_LOCK(); @@ -582,7 +535,7 @@ moea64_pte_clear(struct lpte *pt, uint64 } static __inline void -moea64_pte_set(struct lpte *pt, struct lpte *pvo_pt) +moea64_pte_set_native(struct lpte *pt, struct lpte *pvo_pt) { ASSERT_TABLE_LOCK(); @@ -601,7 +554,7 @@ moea64_pte_set(struct lpte *pt, struct l } static __inline void -moea64_pte_unset(struct lpte *pt, struct lpte *pvo_pt, uint64_t vpn) +moea64_pte_unset_native(struct lpte *pt, struct lpte *pvo_pt, uint64_t vpn) { ASSERT_TABLE_LOCK(); pvo_pt->pte_hi &= ~LPTE_VALID; @@ -620,19 +573,19 @@ moea64_pte_unset(struct lpte *pt, struct /* * Save the reg & chg bits. */ - moea64_pte_synch(pt, pvo_pt); + moea64_pte_synch_native(pt, pvo_pt); moea64_pte_valid--; } static __inline void -moea64_pte_change(struct lpte *pt, struct lpte *pvo_pt, uint64_t vpn) +moea64_pte_change_native(struct lpte *pt, struct lpte *pvo_pt, uint64_t vpn) { /* * Invalidate the PTE */ - moea64_pte_unset(pt, pvo_pt, vpn); - moea64_pte_set(pt, pvo_pt); + moea64_pte_unset_native(pt, pvo_pt, vpn); + moea64_pte_set_native(pt, pvo_pt); } static __inline uint64_t @@ -916,18 +869,11 @@ moea64_setup_direct_map(mmu_t mmup, vm_o ENABLE_TRANS(msr); } -static void -moea64_bootstrap(mmu_t mmup, vm_offset_t kernelstart, vm_offset_t kernelend) +void +moea64_early_bootstrap(mmu_t mmup, vm_offset_t kernelstart, vm_offset_t kernelend) { - ihandle_t mmui; - phandle_t chosen; - phandle_t mmu; - size_t sz; int i, j; - vm_size_t size, physsz, hwphyssz; - vm_offset_t pa, va; - register_t msr; - void *dpcpu; + vm_size_t physsz, hwphyssz; #ifndef __powerpc64__ /* We don't have a direct map since there is no BAT */ @@ -1014,9 +960,6 @@ moea64_bootstrap(mmu_t mmup, vm_offset_t physmem = btoc(physsz); - /* - * Allocate PTEG table. - */ #ifdef PTEGCOUNT moea64_pteg_count = PTEGCOUNT; #else @@ -1027,6 +970,21 @@ moea64_bootstrap(mmu_t mmup, vm_offset_t moea64_pteg_count >>= 1; #endif /* PTEGCOUNT */ +} + +static void +moea64_bootstrap_native(mmu_t mmup, vm_offset_t kernelstart, + vm_offset_t kernelend) +{ + int i; + vm_size_t size; + register_t msr; + + moea64_early_bootstrap(mmup, kernelstart, kernelend); + + /* + * Allocate PTEG table. + */ size = moea64_pteg_count * sizeof(struct lpteg); CTR2(KTR_PMAP, "moea64_bootstrap: %d PTEGs, %d bytes", @@ -1044,11 +1002,76 @@ moea64_bootstrap(mmu_t mmup, vm_offset_t bzero((void *)moea64_pteg_table, moea64_pteg_count * sizeof(struct lpteg)); ENABLE_TRANS(msr); - moea64_pteg_mask = moea64_pteg_count - 1; - CTR1(KTR_PMAP, "moea64_bootstrap: PTEG table at %p", moea64_pteg_table); /* + * Initialize the TLBIE lock. TLBIE can only be executed by one CPU. + */ + mtx_init(&tlbie_mutex, "tlbie mutex", NULL, MTX_SPIN); + + moea64_late_bootstrap(mmup, kernelstart, kernelend); + + /* + * Allocate some things for page zeroing. We put this directly + * in the page table, marked with LPTE_LOCKED, to avoid any + * of the PVO book-keeping or other parts of the VM system + * from even knowing that this hack exists. + */ + + if (!hw_direct_map) { + mtx_init(&moea64_scratchpage_mtx, "pvo zero page", NULL, + MTX_DEF); + for (i = 0; i < 2; i++) { + struct lpte pt; + uint64_t vsid; + int pteidx, ptegidx; + + moea64_scratchpage_va[i] = (virtual_end+1) - PAGE_SIZE; + virtual_end -= PAGE_SIZE; + + LOCK_TABLE(); + + vsid = va_to_vsid(kernel_pmap, + moea64_scratchpage_va[i]); + moea64_pte_create(&pt, vsid, moea64_scratchpage_va[i], + LPTE_NOEXEC, 0); + pt.pte_hi |= LPTE_LOCKED; + + moea64_scratchpage_vpn[i] = (vsid << 16) | + ((moea64_scratchpage_va[i] & ADDR_PIDX) >> + ADDR_PIDX_SHFT); + ptegidx = va_to_pteg(vsid, moea64_scratchpage_va[i], 0); + pteidx = moea64_pte_insert_native(ptegidx, &pt); + if (pt.pte_hi & LPTE_HID) + ptegidx ^= moea64_pteg_mask; + + moea64_scratchpage_pte[i] = + &moea64_pteg_table[ptegidx].pt[pteidx]; + + UNLOCK_TABLE(); + } + } +} + +void +moea64_late_bootstrap(mmu_t mmup, vm_offset_t kernelstart, vm_offset_t kernelend) +{ + ihandle_t mmui; + phandle_t chosen; + phandle_t mmu; + size_t sz; + int i; + vm_size_t size; + vm_offset_t pa, va; + register_t msr; + void *dpcpu; + + /* + * Set PTEG mask + */ + moea64_pteg_mask = moea64_pteg_count - 1; + + /* * Allocate pv/overflow lists. */ size = sizeof(struct pvo_head) * moea64_pteg_count; @@ -1070,11 +1093,6 @@ moea64_bootstrap(mmu_t mmup, vm_offset_t MTX_RECURSE); /* - * Initialize the TLBIE lock. TLBIE can only be executed by one CPU. - */ - mtx_init(&tlbie_mutex, "tlbie mutex", NULL, MTX_SPIN); - - /* * Initialise the unmanaged pvo pool. */ moea64_bpvo_pool = (struct pvo_entry *)moea64_bootstrap_alloc( @@ -1155,7 +1173,7 @@ moea64_bootstrap(mmu_t mmup, vm_offset_t /* * Initialize MMU and remap early physical mappings */ - moea64_cpu_bootstrap(mmup,0); + MMU_CPU_BOOTSTRAP(mmup,0); mtmsr(mfmsr() | PSL_DR | PSL_IR); isync(); pmap_bootstrapped++; bs_remap_earlyboot(); @@ -1191,47 +1209,6 @@ moea64_bootstrap(mmu_t mmup, vm_offset_t #endif /* - * Allocate some things for page zeroing. We put this directly - * in the page table, marked with LPTE_LOCKED, to avoid any - * of the PVO book-keeping or other parts of the VM system - * from even knowing that this hack exists. - */ - - if (!hw_direct_map) { - mtx_init(&moea64_scratchpage_mtx, "pvo zero page", NULL, - MTX_DEF); - for (i = 0; i < 2; i++) { - struct lpte pt; - uint64_t vsid; - int pteidx, ptegidx; - - moea64_scratchpage_va[i] = (virtual_end+1) - PAGE_SIZE; - virtual_end -= PAGE_SIZE; - - LOCK_TABLE(); - - vsid = va_to_vsid(kernel_pmap, - moea64_scratchpage_va[i]); - moea64_pte_create(&pt, vsid, moea64_scratchpage_va[i], - LPTE_NOEXEC, 0); - pt.pte_hi |= LPTE_LOCKED; - - moea64_scratchpage_vpn[i] = (vsid << 16) | - ((moea64_scratchpage_va[i] & ADDR_PIDX) >> - ADDR_PIDX_SHFT); - ptegidx = va_to_pteg(vsid, moea64_scratchpage_va[i], 0); - pteidx = moea64_pte_insert(ptegidx, &pt); - if (pt.pte_hi & LPTE_HID) - ptegidx ^= moea64_pteg_mask; - - moea64_scratchpage_pte[i] = - &moea64_pteg_table[ptegidx].pt[pteidx]; - - UNLOCK_TABLE(); - } - } - - /* * Allocate a kernel stack with a guard page for thread0 and map it * into the kernel page map. */ @@ -1321,7 +1298,10 @@ moea64_change_wiring(mmu_t mmu, pmap_t p if (pvo != NULL) { LOCK_TABLE(); - pt = moea64_pvo_to_pte(pvo); + if (moea64_pvo_to_pte_hook != NULL) + pt = moea64_pvo_to_pte_hook(pvo); + else + pt = moea64_pvo_to_pte_native(pvo); if (wired) { if ((pvo->pvo_vaddr & PVO_WIRED) == 0) @@ -1337,8 +1317,12 @@ moea64_change_wiring(mmu_t mmu, pmap_t p if (pt != NULL) { /* Update wiring flag in page table. */ - moea64_pte_change(pt, &pvo->pvo_pte.lpte, - pvo->pvo_vpn); + if (moea64_pte_change_hook != NULL) + moea64_pte_change_hook(pt, &pvo->pvo_pte.lpte, + pvo->pvo_vpn); + else + moea64_pte_change_native(pt, &pvo->pvo_pte.lpte, + pvo->pvo_vpn); } else if (wired) { /* * If we are wiring the page, and it wasn't in the @@ -1348,7 +1332,13 @@ moea64_change_wiring(mmu_t mmu, pmap_t p ptegidx = va_to_pteg(vsid, PVO_VADDR(pvo), pvo->pvo_vaddr & PVO_LARGE); - i = moea64_pte_insert(ptegidx, &pvo->pvo_pte.lpte); + if (moea64_pte_insert_hook != NULL) + i = moea64_pte_insert_hook(ptegidx, + &pvo->pvo_pte.lpte); + else + i = moea64_pte_insert_native(ptegidx, + &pvo->pvo_pte.lpte); + if (i >= 0) { PVO_PTEGIDX_CLR(pvo); PVO_PTEGIDX_SET(pvo, i); @@ -1849,15 +1839,25 @@ moea64_remove_write(mmu_t mmu, vm_page_t PMAP_LOCK(pmap); LOCK_TABLE(); if ((pvo->pvo_pte.lpte.pte_lo & LPTE_PP) != LPTE_BR) { - pt = moea64_pvo_to_pte(pvo); + if (moea64_pvo_to_pte_hook != NULL) + pt = moea64_pvo_to_pte_hook(pvo); + else + pt = moea64_pvo_to_pte_native(pvo); pvo->pvo_pte.lpte.pte_lo &= ~LPTE_PP; pvo->pvo_pte.lpte.pte_lo |= LPTE_BR; if (pt != NULL) { - moea64_pte_synch(pt, &pvo->pvo_pte.lpte); + if (moea64_pte_synch_hook != NULL) + moea64_pte_synch_hook(pt, &pvo->pvo_pte.lpte); + else + moea64_pte_synch_native(pt, &pvo->pvo_pte.lpte); lo |= pvo->pvo_pte.lpte.pte_lo; pvo->pvo_pte.lpte.pte_lo &= ~LPTE_CHG; - moea64_pte_change(pt, &pvo->pvo_pte.lpte, - pvo->pvo_vpn); + if (moea64_pte_change_hook != NULL) + moea64_pte_change_hook(pt, + &pvo->pvo_pte.lpte, pvo->pvo_vpn); + else + moea64_pte_change_native(pt, + &pvo->pvo_pte.lpte, pvo->pvo_vpn); if (pvo->pvo_pmap == kernel_pmap) isync(); } @@ -2167,7 +2167,10 @@ moea64_protect(mmu_t mmu, pmap_t pm, vm_ * copy. */ LOCK_TABLE(); - pt = moea64_pvo_to_pte(pvo); + if (moea64_pvo_to_pte_hook != NULL) + pt = moea64_pvo_to_pte_hook(pvo); + else + pt = moea64_pvo_to_pte_native(pvo); /* * Change the protection of the page. @@ -2182,7 +2185,12 @@ moea64_protect(mmu_t mmu, pmap_t pm, vm_ * If the PVO is in the page table, update that pte as well. */ if (pt != NULL) { - moea64_pte_change(pt, &pvo->pvo_pte.lpte, pvo->pvo_vpn); + if (moea64_pte_change_hook != NULL) + moea64_pte_change_hook(pt, &pvo->pvo_pte.lpte, + pvo->pvo_vpn); + else + moea64_pte_change_native(pt, &pvo->pvo_pte.lpte, + pvo->pvo_vpn); if ((pvo->pvo_pte.lpte.pte_lo & (LPTE_I | LPTE_G | LPTE_NOEXEC)) == 0) { moea64_syncicache(pm, sva, @@ -2310,7 +2318,7 @@ moea64_remove_all(mmu_t mmu, vm_page_t m * Can only be called from moea64_bootstrap before avail start and end are * calculated. */ -static vm_offset_t +vm_offset_t moea64_bootstrap_alloc(vm_size_t size, u_int align) { vm_offset_t s, e; @@ -2439,8 +2447,12 @@ moea64_pvo_enter(pmap_t pm, uma_zone_t z (pte_lo & LPTE_PP)) { if (!(pvo->pvo_pte.lpte.pte_hi & LPTE_VALID)) { /* Re-insert if spilled */ - i = moea64_pte_insert(ptegidx, - &pvo->pvo_pte.lpte); + if (moea64_pte_insert_hook != NULL) + i = moea64_pte_insert_hook(ptegidx, + &pvo->pvo_pte.lpte); + else + i = moea64_pte_insert_native(ptegidx, + &pvo->pvo_pte.lpte); if (i >= 0) PVO_PTEGIDX_SET(pvo, i); moea64_pte_overflow--; @@ -2523,7 +2535,10 @@ moea64_pvo_enter(pmap_t pm, uma_zone_t z /* * We hope this succeeds but it isn't required. */ - i = moea64_pte_insert(ptegidx, &pvo->pvo_pte.lpte); + if (moea64_pte_insert_hook != NULL) + i = moea64_pte_insert_hook(ptegidx, &pvo->pvo_pte.lpte); + else + i = moea64_pte_insert_native(ptegidx, &pvo->pvo_pte.lpte); if (i >= 0) { PVO_PTEGIDX_SET(pvo, i); } else { @@ -2558,9 +2573,15 @@ moea64_pvo_remove(struct pvo_entry *pvo) * save the ref & cfg bits). */ LOCK_TABLE(); - pt = moea64_pvo_to_pte(pvo); + if (moea64_pvo_to_pte_hook != NULL) + pt = moea64_pvo_to_pte_hook(pvo); + else + pt = moea64_pvo_to_pte_native(pvo); if (pt != NULL) { - moea64_pte_unset(pt, &pvo->pvo_pte.lpte, pvo->pvo_vpn); + if (moea64_pte_unset_hook != NULL) + moea64_pte_unset_hook(pt, &pvo->pvo_pte.lpte, pvo->pvo_vpn); + else + moea64_pte_unset_native(pt, &pvo->pvo_pte.lpte, pvo->pvo_vpn); PVO_PTEGIDX_CLR(pvo); } else { moea64_pte_overflow--; @@ -2642,7 +2663,7 @@ moea64_pvo_find_va(pmap_t pm, vm_offset_ } static struct lpte * -moea64_pvo_to_pte(const struct pvo_entry *pvo) +moea64_pvo_to_pte_native(const struct pvo_entry *pvo) { struct lpte *pt; int pteidx, ptegidx; @@ -2736,7 +2757,7 @@ moea64_pte_spillable_ident(u_int ptegidx } static int -moea64_pte_insert(u_int ptegidx, struct lpte *pvo_pt) +moea64_pte_insert_native(u_int ptegidx, struct lpte *pvo_pt) { struct lpte *pt; struct pvo_entry *pvo; @@ -2752,7 +2773,7 @@ moea64_pte_insert(u_int ptegidx, struct for (pt = moea64_pteg_table[pteg_bktidx].pt, i = 0; i < 8; i++, pt++) { if ((pt->pte_hi & (LPTE_VALID | LPTE_LOCKED)) == 0) { pvo_pt->pte_hi &= ~LPTE_HID; - moea64_pte_set(pt, pvo_pt); + moea64_pte_set_native(pt, pvo_pt); return (i); } } @@ -2764,7 +2785,7 @@ moea64_pte_insert(u_int ptegidx, struct for (pt = moea64_pteg_table[pteg_bktidx].pt, i = 0; i < 8; i++, pt++) { if ((pt->pte_hi & (LPTE_VALID | LPTE_LOCKED)) == 0) { pvo_pt->pte_hi |= LPTE_HID; - moea64_pte_set(pt, pvo_pt); + moea64_pte_set_native(pt, pvo_pt); return (i); } } @@ -2804,7 +2825,8 @@ moea64_pte_insert(u_int ptegidx, struct if (pvo->pvo_pte.lpte.pte_hi == pt->pte_hi) { KASSERT(pvo->pvo_pte.lpte.pte_hi & LPTE_VALID, ("Invalid PVO for valid PTE!")); - moea64_pte_unset(pt, &pvo->pvo_pte.lpte, pvo->pvo_vpn); + moea64_pte_unset_native(pt, &pvo->pvo_pte.lpte, + pvo->pvo_vpn); PVO_PTEGIDX_CLR(pvo); moea64_pte_overflow++; break; @@ -2817,7 +2839,7 @@ moea64_pte_insert(u_int ptegidx, struct /* * Set the new PTE. */ - moea64_pte_set(pt, pvo_pt); + moea64_pte_set_native(pt, pvo_pt); return (i); } @@ -2863,9 +2885,12 @@ moea64_query_bit(vm_page_t m, u_int64_t * ptebit is set, cache it and return success. */ LOCK_TABLE(); - pt = moea64_pvo_to_pte(pvo); + pt = moea64_pvo_to_pte_native(pvo); if (pt != NULL) { - moea64_pte_synch(pt, &pvo->pvo_pte.lpte); + if (moea64_pte_synch_hook != NULL) + moea64_pte_synch_hook(pt, &pvo->pvo_pte.lpte); + else + moea64_pte_synch_native(pt, &pvo->pvo_pte.lpte); if (pvo->pvo_pte.lpte.pte_lo & ptebit) { UNLOCK_TABLE(); @@ -2914,12 +2939,24 @@ moea64_clear_bit(vm_page_t m, u_int64_t MOEA_PVO_CHECK(pvo); /* sanity check */ LOCK_TABLE(); - pt = moea64_pvo_to_pte(pvo); + if (moea64_pvo_to_pte_hook != NULL) + pt = moea64_pvo_to_pte_hook(pvo); + else + pt = moea64_pvo_to_pte_native(pvo); if (pt != NULL) { - moea64_pte_synch(pt, &pvo->pvo_pte.lpte); + if (moea64_pte_synch_hook != NULL) + moea64_pte_synch_hook(pt, &pvo->pvo_pte.lpte); + else + moea64_pte_synch_native(pt, &pvo->pvo_pte.lpte); if (pvo->pvo_pte.lpte.pte_lo & ptebit) { count++; - moea64_pte_clear(pt, pvo->pvo_vpn, ptebit); + if (moea64_pte_clear_hook != NULL) + moea64_pte_clear_hook(pt, + &pvo->pvo_pte.lpte, pvo->pvo_vpn, + ptebit); + else + moea64_pte_clear_native(pt, + pvo->pvo_vpn, ptebit); } } pvo->pvo_pte.lpte.pte_lo &= ~ptebit; @@ -2994,7 +3031,7 @@ moea64_unmapdev(mmu_t mmu, vm_offset_t v kmem_free(kernel_map, base, size); } -static void +void moea64_sync_icache(mmu_t mmu, pmap_t pm, vm_offset_t va, vm_size_t sz) { struct pvo_entry *pvo; Added: user/nwhitehorn/ps3/powerpc/aim/mmu_oea64.h ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ user/nwhitehorn/ps3/powerpc/aim/mmu_oea64.h Mon Jul 5 01:09:59 2010 (r209705) @@ -0,0 +1,119 @@ +/*- + * Copyright (C) 2010 Nathan Whitehorn + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _POWERPC_AIM_MMU_OEA64_H +#define _POWERPC_AIM_MMU_OEA64_H + +#include + +/* + * Helper routines + */ + +/* Allocate physical memory for use in moea64_bootstrap. */ +vm_offset_t moea64_bootstrap_alloc(vm_size_t, u_int); + +/* Bootstrap bits before the page table is allocated */ +void moea64_early_bootstrap(mmu_t mmup, vm_offset_t kernelstart, + vm_offset_t kernelend); +/* Bootstrap bits after the page table is allocated */ +void moea64_late_bootstrap(mmu_t mmup, vm_offset_t kernelstart, + vm_offset_t kernelend); + +/* + * Statistics + */ + +extern u_int moea64_pte_valid; +extern u_int moea64_pte_overflow; + +/* + * State variables + */ + +extern struct pvo_head *moea64_pvo_table; +extern int moea64_large_page_shift; +extern u_int moea64_pteg_count; +extern u_int moea64_pteg_mask; + +/* + * Page table manipulation hooks + */ + +extern void (*moea64_pte_synch_hook)(struct lpte *pt, struct lpte *pvo_pt); +extern void (*moea64_pte_clear_hook)(struct lpte *pt, struct lpte *pvo_pt, + uint64_t vpn, u_int64_t ptebit); +extern void (*moea64_pte_unset_hook)(struct lpte *pt, struct lpte *pvo_pt, + uint64_t vpn); +extern void (*moea64_pte_change_hook)(struct lpte *pt, struct lpte *pvo_pt, + uint64_t vpn); +extern int (*moea64_pte_insert_hook)(u_int ptegidx, struct lpte *pvo_pt); +extern struct lpte *(*moea64_pvo_to_pte_hook)(const struct pvo_entry *pvo); + +/* MMU Interface */ + +void moea64_change_wiring(mmu_t, pmap_t, vm_offset_t, boolean_t); +void moea64_clear_modify(mmu_t, vm_page_t); +void moea64_clear_reference(mmu_t, vm_page_t); +void moea64_copy_page(mmu_t, vm_page_t, vm_page_t); +void moea64_enter(mmu_t, pmap_t, vm_offset_t, vm_page_t, vm_prot_t, + boolean_t); +void moea64_enter_object(mmu_t, pmap_t, vm_offset_t, vm_offset_t, + vm_page_t, vm_prot_t); +void moea64_enter_quick(mmu_t, pmap_t, vm_offset_t, vm_page_t, + vm_prot_t); +vm_paddr_t moea64_extract(mmu_t, pmap_t, vm_offset_t); +vm_page_t moea64_extract_and_hold(mmu_t, pmap_t, vm_offset_t, vm_prot_t); +void moea64_init(mmu_t); +boolean_t moea64_is_modified(mmu_t, vm_page_t); +boolean_t moea64_is_referenced(mmu_t, vm_page_t); +boolean_t moea64_ts_referenced(mmu_t, vm_page_t); +vm_offset_t moea64_map(mmu_t, vm_offset_t *, vm_offset_t, vm_offset_t, int); +boolean_t moea64_page_exists_quick(mmu_t, pmap_t, vm_page_t); +int moea64_page_wired_mappings(mmu_t, vm_page_t); +void moea64_pinit(mmu_t, pmap_t); +void moea64_pinit0(mmu_t, pmap_t); +void moea64_protect(mmu_t, pmap_t, vm_offset_t, vm_offset_t, + vm_prot_t); +void moea64_qenter(mmu_t, vm_offset_t, vm_page_t *, int); +void moea64_qremove(mmu_t, vm_offset_t, int); +void moea64_release(mmu_t, pmap_t); +void moea64_remove(mmu_t, pmap_t, vm_offset_t, vm_offset_t); +void moea64_remove_all(mmu_t, vm_page_t); +void moea64_remove_write(mmu_t, vm_page_t); +void moea64_zero_page(mmu_t, vm_page_t); +void moea64_zero_page_area(mmu_t, vm_page_t, int, int); +void moea64_zero_page_idle(mmu_t, vm_page_t); +void moea64_activate(mmu_t, struct thread *); +void moea64_deactivate(mmu_t, struct thread *); +void *moea64_mapdev(mmu_t, vm_offset_t, vm_size_t); +void moea64_unmapdev(mmu_t, vm_offset_t, vm_size_t); +vm_offset_t moea64_kextract(mmu_t, vm_offset_t); +void moea64_kenter(mmu_t, vm_offset_t, vm_offset_t); +boolean_t moea64_dev_direct_mapped(mmu_t, vm_offset_t, vm_size_t); +void moea64_sync_icache(mmu_t, pmap_t, vm_offset_t, vm_size_t); + +#endif /* _POWERPC_AIM_MMU_OEA64_H */ + Modified: user/nwhitehorn/ps3/powerpc/include/pmap.h ============================================================================== --- user/nwhitehorn/ps3/powerpc/include/pmap.h Sun Jul 4 22:17:56 2010 (r209704) +++ user/nwhitehorn/ps3/powerpc/include/pmap.h Mon Jul 5 01:09:59 2010 (r209705) @@ -122,6 +122,24 @@ struct pvo_entry { }; LIST_HEAD(pvo_head, pvo_entry); +#define PVO_PTEGIDX_MASK 0x007UL /* which PTEG slot */ +#define PVO_PTEGIDX_VALID 0x008UL /* slot is valid */ +#define PVO_WIRED 0x010UL /* PVO entry is wired */ +#define PVO_MANAGED 0x020UL /* PVO entry is managed */ +#define PVO_BOOTSTRAP 0x080UL /* PVO entry allocated during + bootstrap */ +#define PVO_FAKE 0x100UL /* fictitious phys page */ +#define PVO_LARGE 0x200UL /* large page */ +#define PVO_VADDR(pvo) ((pvo)->pvo_vaddr & ~ADDR_POFF) +#define PVO_ISFAKE(pvo) ((pvo)->pvo_vaddr & PVO_FAKE) +#define PVO_PTEGIDX_GET(pvo) ((pvo)->pvo_vaddr & PVO_PTEGIDX_MASK) +#define PVO_PTEGIDX_ISSET(pvo) ((pvo)->pvo_vaddr & PVO_PTEGIDX_VALID) +#define PVO_PTEGIDX_CLR(pvo) \ + ((void)((pvo)->pvo_vaddr &= ~(PVO_PTEGIDX_VALID|PVO_PTEGIDX_MASK))) +#define PVO_PTEGIDX_SET(pvo, i) \ + ((void)((pvo)->pvo_vaddr |= (i)|PVO_PTEGIDX_VALID)) +#define PVO_VSID(pvo) ((pvo)->pvo_vpn >> 16) + struct md_page { u_int64_t mdpg_attrs; struct pvo_head mdpg_pvoh; From owner-svn-src-user@FreeBSD.ORG Mon Jul 5 01:11:42 2010 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 263D7106564A; Mon, 5 Jul 2010 01:11:42 +0000 (UTC) (envelope-from nwhitehorn@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 168698FC08; Mon, 5 Jul 2010 01:11:42 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id o651BfDL099535; Mon, 5 Jul 2010 01:11:41 GMT (envelope-from nwhitehorn@svn.freebsd.org) Received: (from nwhitehorn@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o651Bfpo099533; Mon, 5 Jul 2010 01:11:41 GMT (envelope-from nwhitehorn@svn.freebsd.org) Message-Id: <201007050111.o651Bfpo099533@svn.freebsd.org> From: Nathan Whitehorn Date: Mon, 5 Jul 2010 01:11:41 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r209706 - user/nwhitehorn/ps3/powerpc/ps3 X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 05 Jul 2010 01:11:42 -0000 Author: nwhitehorn Date: Mon Jul 5 01:11:41 2010 New Revision: 209706 URL: http://svn.freebsd.org/changeset/base/209706 Log: Missed some slots in the parameter save area, which caused hypercall stubs to trample over memory when given more than 8 arguments. While here, remove the comment pass-through for the ASM file. It caused problems, and isn't necessary. Modified: user/nwhitehorn/ps3/powerpc/ps3/ps3-hv-asm.awk Modified: user/nwhitehorn/ps3/powerpc/ps3/ps3-hv-asm.awk ============================================================================== --- user/nwhitehorn/ps3/powerpc/ps3/ps3-hv-asm.awk Mon Jul 5 01:09:59 2010 (r209705) +++ user/nwhitehorn/ps3/powerpc/ps3/ps3-hv-asm.awk Mon Jul 5 01:11:41 2010 (r209706) @@ -13,10 +13,6 @@ BEGIN { printf("#define hc .long 0x44000022\n\n"); } -/[ \/]\*.*/ { - print($0); -} - /HVCALL.*/ { code = $2; ins = split($4, a, ",") @@ -33,7 +29,7 @@ BEGIN { # Save output reg addresses to the stack for (i = 0; i < outs; i++) { if (ins+i >= 8) { - printf("\tld %%r11,%d(%%r1)\n", 48+8*outs + 48 + 8*i); + printf("\tld %%r11,%d(%%r1)\n", 48+8*outs + 48 + 8*(i+ins)); printf("\tstd %%r11,%d(%%r1)\n", 48+8*i); } else { printf("\tstd %%r%d,%d(%%r1)\n", 3+ins+i, 48+8*i); From owner-svn-src-user@FreeBSD.ORG Mon Jul 5 01:12:41 2010 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 802311065675; Mon, 5 Jul 2010 01:12:41 +0000 (UTC) (envelope-from nwhitehorn@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 6673F8FC18; Mon, 5 Jul 2010 01:12:41 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id o651CfNp099797; Mon, 5 Jul 2010 01:12:41 GMT (envelope-from nwhitehorn@svn.freebsd.org) Received: (from nwhitehorn@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o651Cf5O099795; Mon, 5 Jul 2010 01:12:41 GMT (envelope-from nwhitehorn@svn.freebsd.org) Message-Id: <201007050112.o651Cf5O099795@svn.freebsd.org> From: Nathan Whitehorn Date: Mon, 5 Jul 2010 01:12:41 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r209707 - user/nwhitehorn/ps3/powerpc/ps3 X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 05 Jul 2010 01:12:41 -0000 Author: nwhitehorn Date: Mon Jul 5 01:12:41 2010 New Revision: 209707 URL: http://svn.freebsd.org/changeset/base/209707 Log: Teach the PS3 syscons module how to reopen the framebuffer. Modified: user/nwhitehorn/ps3/powerpc/ps3/ps3_syscons.c Modified: user/nwhitehorn/ps3/powerpc/ps3/ps3_syscons.c ============================================================================== --- user/nwhitehorn/ps3/powerpc/ps3/ps3_syscons.c Mon Jul 5 01:11:41 2010 (r209706) +++ user/nwhitehorn/ps3/powerpc/ps3/ps3_syscons.c Mon Jul 5 01:12:41 2010 (r209707) @@ -42,20 +42,35 @@ __FBSDID("$FreeBSD$"); #include #include +#include +#include + #include #include #include +#include #include #include #include +#include "ps3-hvcall.h" + +#define PS3FB_SIZE (4*1024*1024) + +#define L1GPU_CONTEXT_ATTRIBUTE_DISPLAY_MODE_SET 0x0100 +#define L1GPU_CONTEXT_ATTRIBUTE_DISPLAY_SYNC 0x0101 +#define L1GPU_DISPLAY_SYNC_HSYNC 1 +#define L1GPU_DISPLAY_SYNC_VSYNC 2 +#define L1GPU_CONTEXT_ATTRIBUTE_DISPLAY_FLIP 0x0102 + extern u_char dflt_font_16[]; extern u_char dflt_font_14[]; extern u_char dflt_font_8[]; static int ps3fb_configure(int flags); +void ps3fb_remap(void); static vi_probe_t ps3fb_probe; static vi_init_t ps3fb_init; @@ -210,7 +225,6 @@ static int ps3fb_configure(int flags) { struct ps3fb_softc *sc; - vm_offset_t fb_phys; int disable; char compatible[64]; #if 0 @@ -250,22 +264,44 @@ ps3fb_configure(int flags) sc->sc_stride = sc->sc_width*4; /* - * Grab the physical address of the framebuffer, and then map it - * into our memory space. If the MMU is not yet up, it will be - * remapped for us when relocation turns on. - * - * XXX We assume #address-cells is 1 at this point. + * The loader puts the FB at 0x10000000, so use that for now. */ - fb_phys = 0x10000000; - - bus_space_map(&bs_be_tag, fb_phys, sc->sc_height * sc->sc_stride, - 0, &sc->sc_addr); + sc->sc_addr = 0x10000000; ps3fb_init(0, &sc->sc_va, 0); return (0); } +void +ps3fb_remap(void) +{ + vm_offset_t va, fb_paddr; + uint64_t fbhandle, fbcontext; + + lv1_gpu_close(); + lv1_gpu_open(0); + + lv1_gpu_context_attribute(0, L1GPU_CONTEXT_ATTRIBUTE_DISPLAY_MODE_SET, + 0,0,0,0); + lv1_gpu_context_attribute(0, L1GPU_CONTEXT_ATTRIBUTE_DISPLAY_MODE_SET, + 0,0,1,0); + lv1_gpu_context_attribute(0, L1GPU_CONTEXT_ATTRIBUTE_DISPLAY_SYNC, + 0,L1GPU_DISPLAY_SYNC_VSYNC,0,0); + lv1_gpu_context_attribute(0, L1GPU_CONTEXT_ATTRIBUTE_DISPLAY_SYNC, + 1,L1GPU_DISPLAY_SYNC_VSYNC,0,0); + lv1_gpu_memory_allocate(PS3FB_SIZE, 0, 0, 0, 0, &fbhandle, &fb_paddr); + lv1_gpu_context_allocate(fbhandle, 0, &fbcontext); + + lv1_gpu_context_attribute(fbcontext, + L1GPU_CONTEXT_ATTRIBUTE_DISPLAY_FLIP, 0, 0, 0, 0); + lv1_gpu_context_attribute(fbcontext, + L1GPU_CONTEXT_ATTRIBUTE_DISPLAY_FLIP, 1, 0, 0, 0); + + for (va = 0; va < PS3FB_SIZE; va += PAGE_SIZE) + pmap_kenter(0x10000000 + va, fb_paddr + va); +} + static int ps3fb_probe(int unit, video_adapter_t **adp, void *arg, int flags) { From owner-svn-src-user@FreeBSD.ORG Mon Jul 5 01:14:32 2010 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 812E0106566B; Mon, 5 Jul 2010 01:14:32 +0000 (UTC) (envelope-from nwhitehorn@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 6FBFD8FC15; Mon, 5 Jul 2010 01:14:32 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id o651EW2q000333; Mon, 5 Jul 2010 01:14:32 GMT (envelope-from nwhitehorn@svn.freebsd.org) Received: (from nwhitehorn@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o651EWHp000326; Mon, 5 Jul 2010 01:14:32 GMT (envelope-from nwhitehorn@svn.freebsd.org) Message-Id: <201007050114.o651EWHp000326@svn.freebsd.org> From: Nathan Whitehorn Date: Mon, 5 Jul 2010 01:14:32 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r209708 - in user/nwhitehorn/ps3: conf powerpc/ps3 X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 05 Jul 2010 01:14:32 -0000 Author: nwhitehorn Date: Mon Jul 5 01:14:32 2010 New Revision: 209708 URL: http://svn.freebsd.org/changeset/base/209708 Log: Add support for the LV1 hypervisor MMU routines. This gets the PS3 to boot to the point of complaining about the lack of a PIC driver (and to print cpu0: IBM Cell Broadband Engine revision 0.0 to the console on the way). Added: user/nwhitehorn/ps3/powerpc/ps3/mmu_ps3.c Modified: user/nwhitehorn/ps3/conf/files.powerpc64 user/nwhitehorn/ps3/powerpc/ps3/platform_ps3.c user/nwhitehorn/ps3/powerpc/ps3/ps3-hvcall.S user/nwhitehorn/ps3/powerpc/ps3/ps3-hvcall.h user/nwhitehorn/ps3/powerpc/ps3/ps3-hvcall.master Modified: user/nwhitehorn/ps3/conf/files.powerpc64 ============================================================================== --- user/nwhitehorn/ps3/conf/files.powerpc64 Mon Jul 5 01:12:41 2010 (r209707) +++ user/nwhitehorn/ps3/conf/files.powerpc64 Mon Jul 5 01:14:32 2010 (r209708) @@ -137,8 +137,9 @@ powerpc/powerpc/suswintr.c standard powerpc/powerpc/syncicache.c standard powerpc/powerpc/sys_machdep.c standard powerpc/powerpc/uio_machdep.c standard +powerpc/ps3/mmu_ps3.c optional ps3 powerpc/ps3/platform_ps3.c optional ps3 -powerpc/ps3/ps3_syscons.c optional ps3 +powerpc/ps3/ps3_syscons.c optional ps3 sc powerpc/ps3/ps3-hvcall.S optional ps3 compat/freebsd32/freebsd32_ioctl.c optional compat_freebsd32 Added: user/nwhitehorn/ps3/powerpc/ps3/mmu_ps3.c ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ user/nwhitehorn/ps3/powerpc/ps3/mmu_ps3.c Mon Jul 5 01:14:32 2010 (r209708) @@ -0,0 +1,333 @@ +/*- + * Copyright (C) 2010 Nathan Whitehorn + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "mmu_if.h" +#include "ps3-hvcall.h" + +#define VSID_HASH_MASK 0x0000007fffffffffULL + +extern int ps3fb_remap(void); + +static uint64_t mps3_vas_id; + +/* + * Kernel MMU interface + */ + +static void mps3_bootstrap(mmu_t mmup, vm_offset_t kernelstart, + vm_offset_t kernelend); +static void mps3_cpu_bootstrap(mmu_t mmup, int ap); +static void mps3_pte_synch(struct lpte *pt, struct lpte *pvo_pt); +static void mps3_pte_clear(struct lpte *pt, struct lpte *pvo_pt, + uint64_t vpn, u_int64_t ptebit); +static void mps3_pte_unset(struct lpte *pt, struct lpte *pvo_pt, + uint64_t vpn); +static void mps3_pte_change(struct lpte *pt, struct lpte *pvo_pt, + uint64_t vpn); +static int mps3_pte_insert(u_int ptegidx, struct lpte *pvo_pt); +static struct lpte *mps3_pvo_to_pte(const struct pvo_entry *pvo); + + +static mmu_method_t mps3_methods[] = { + MMUMETHOD(mmu_change_wiring, moea64_change_wiring), + MMUMETHOD(mmu_clear_modify, moea64_clear_modify), + MMUMETHOD(mmu_clear_reference, moea64_clear_reference), + MMUMETHOD(mmu_copy_page, moea64_copy_page), + MMUMETHOD(mmu_enter, moea64_enter), + MMUMETHOD(mmu_enter_object, moea64_enter_object), + MMUMETHOD(mmu_enter_quick, moea64_enter_quick), + MMUMETHOD(mmu_extract, moea64_extract), + MMUMETHOD(mmu_extract_and_hold, moea64_extract_and_hold), + MMUMETHOD(mmu_init, moea64_init), + MMUMETHOD(mmu_is_modified, moea64_is_modified), + MMUMETHOD(mmu_is_referenced, moea64_is_referenced), + MMUMETHOD(mmu_ts_referenced, moea64_ts_referenced), + MMUMETHOD(mmu_map, moea64_map), + MMUMETHOD(mmu_page_exists_quick,moea64_page_exists_quick), + MMUMETHOD(mmu_page_wired_mappings,moea64_page_wired_mappings), + MMUMETHOD(mmu_pinit, moea64_pinit), + MMUMETHOD(mmu_pinit0, moea64_pinit0), + MMUMETHOD(mmu_protect, moea64_protect), + MMUMETHOD(mmu_qenter, moea64_qenter), + MMUMETHOD(mmu_qremove, moea64_qremove), + MMUMETHOD(mmu_release, moea64_release), + MMUMETHOD(mmu_remove, moea64_remove), + MMUMETHOD(mmu_remove_all, moea64_remove_all), + MMUMETHOD(mmu_remove_write, moea64_remove_write), + MMUMETHOD(mmu_sync_icache, moea64_sync_icache), + MMUMETHOD(mmu_zero_page, moea64_zero_page), + MMUMETHOD(mmu_zero_page_area, moea64_zero_page_area), + MMUMETHOD(mmu_zero_page_idle, moea64_zero_page_idle), + MMUMETHOD(mmu_activate, moea64_activate), + MMUMETHOD(mmu_deactivate, moea64_deactivate), + + /* Internal interfaces */ + MMUMETHOD(mmu_bootstrap, mps3_bootstrap), + MMUMETHOD(mmu_cpu_bootstrap, mps3_cpu_bootstrap), + MMUMETHOD(mmu_mapdev, moea64_mapdev), + MMUMETHOD(mmu_unmapdev, moea64_unmapdev), + MMUMETHOD(mmu_kextract, moea64_kextract), + MMUMETHOD(mmu_kenter, moea64_kenter), + MMUMETHOD(mmu_dev_direct_mapped,moea64_dev_direct_mapped), + + { 0, 0 } +}; + +static mmu_def_t ps3_mmu = { + "mmu_ps3", + mps3_methods, + 0 +}; +MMU_DEF(ps3_mmu); + +static void +mps3_bootstrap(mmu_t mmup, vm_offset_t kernelstart, vm_offset_t kernelend) +{ + uint64_t final_pteg_count; + + /* + * Set our page table override functions + */ + moea64_pte_synch_hook = mps3_pte_synch; + moea64_pte_clear_hook = mps3_pte_clear; + moea64_pte_unset_hook = mps3_pte_unset; + moea64_pte_change_hook = mps3_pte_change; + moea64_pte_insert_hook = mps3_pte_insert; + moea64_pvo_to_pte_hook = mps3_pvo_to_pte; + + moea64_early_bootstrap(mmup, kernelstart, kernelend); + + lv1_construct_virtual_address_space( + 20 /* log_2(moea64_pteg_count) */, 2 /* n page sizes */, + (24UL << 56) | (16UL << 48) /* page sizes 16 MB + 64 KB */, + &mps3_vas_id, &final_pteg_count + ); + + moea64_pteg_count = final_pteg_count / sizeof(struct lpteg); + + moea64_late_bootstrap(mmup, kernelstart, kernelend); +} + +static void +mps3_cpu_bootstrap(mmu_t mmup, int ap) +{ + struct slb *slb = PCPU_GET(slb); + register_t seg0; + int i; + + mtmsr(mfmsr() & ~PSL_DR & ~PSL_IR); + + /* + * Destroy the loader's address space if we are coming up for + * the first time, and redo the FB mapping so we can continue + * having a console. + */ + + if (!ap) + lv1_destruct_virtual_address_space(0); + + lv1_select_virtual_address_space(mps3_vas_id); + mps3_vas_id = 0; /* Now this is the current mapping */ + + if (!ap) + ps3fb_remap(); + + /* + * Install kernel SLB entries + */ + + __asm __volatile ("slbia"); + __asm __volatile ("slbmfee %0,%1; slbie %0;" : "=r"(seg0) : "r"(0)); + for (i = 0; i < 64; i++) { + if (!(slb[i].slbe & SLBE_VALID)) + continue; + + __asm __volatile ("slbmte %0, %1" :: + "r"(slb[i].slbv), "r"(slb[i].slbe)); + } +} + +static void +mps3_pte_synch(struct lpte *pt, struct lpte *pvo_pt) +{ + uint64_t halfbucket[4], rcbits; + uint64_t slot = (uint64_t)(pt)-1; + + lv1_read_htab_entries(mps3_vas_id, slot & ~0x3UL, &halfbucket[0], + &halfbucket[1], &halfbucket[2], &halfbucket[3], &rcbits); + + pvo_pt->pte_lo |= ((rcbits >> (slot & 0x3)) & 0x3) << 7; +} + +static void +mps3_pte_clear(struct lpte *pt, struct lpte *pvo_pt, uint64_t vpn, + u_int64_t ptebit) +{ + uint64_t slot = (uint64_t)(pt)-1; + + lv1_write_htab_entry(mps3_vas_id, slot, pvo_pt->pte_hi, + pvo_pt->pte_lo & ~ptebit); +} + +static void +mps3_pte_unset(struct lpte *pt, struct lpte *pvo_pt, uint64_t vpn) +{ + uint64_t slot = (uint64_t)(pt)-1; + + pvo_pt->pte_hi &= ~LPTE_VALID; + lv1_write_htab_entry(mps3_vas_id, slot, 0, 0); + moea64_pte_valid--; +} + +static void +mps3_pte_change(struct lpte *pt, struct lpte *pvo_pt, uint64_t vpn) +{ + uint64_t slot = (uint64_t)(pt)-1; + + pvo_pt->pte_hi |= LPTE_VALID; + lv1_write_htab_entry(mps3_vas_id, slot & ~0x3UL, pvo_pt->pte_hi, + pvo_pt->pte_lo); +} + +static int +mps3_pte_insert(u_int ptegidx, struct lpte *pvo_pt) +{ + int result; + struct lpte evicted; + struct pvo_entry *pvo; + uint64_t index; + + pvo_pt->pte_hi |= LPTE_VALID; + pvo_pt->pte_hi &= ~LPTE_HID; + evicted.pte_hi = 0; + result = lv1_insert_htab_entry(mps3_vas_id, ptegidx << 3, + pvo_pt->pte_hi, pvo_pt->pte_lo, LPTE_LOCKED | LPTE_WIRED, 0, + &index, &evicted.pte_hi, &evicted.pte_lo); + + if (result != 0) { + /* No freeable slots in either PTEG? We're hosed. */ + mtmsr(mfmsr() | PSL_DR); panic("moea64_pte_insert: overflow"); + return (-1); + } + + /* + * See where we ended up. + */ + if (index >> 3 != ptegidx) + pvo_pt->pte_hi |= LPTE_HID; + + moea64_pte_valid++; + + if (!evicted.pte_hi) + return (index & 0x7); + + /* + * Synchronize the sacrifice PTE with its PVO, then mark both + * invalid. The PVO will be reused when/if the VM system comes + * here after a fault. + */ + + if (evicted.pte_hi & LPTE_HID) + ptegidx ^= moea64_pteg_mask; /* PTEs indexed by primary */ + + LIST_FOREACH(pvo, &moea64_pvo_table[ptegidx], pvo_olink) { + if (pvo->pvo_pte.lpte.pte_hi == evicted.pte_hi) { + KASSERT(pvo->pvo_pte.lpte.pte_hi & LPTE_VALID, + ("Invalid PVO for valid PTE!")); + pvo->pvo_pte.lpte.pte_hi &= ~LPTE_VALID; + pvo->pvo_pte.lpte.pte_lo |= + evicted.pte_lo & (LPTE_REF | LPTE_CHG); + PVO_PTEGIDX_CLR(pvo); + moea64_pte_valid--; + moea64_pte_overflow++; + break; + } + } + + return (index & 0x7); +} + +static __inline u_int +va_to_pteg(uint64_t vsid, vm_offset_t addr, int large) +{ + uint64_t hash; + int shift; + + shift = large ? moea64_large_page_shift : ADDR_PIDX_SHFT; + hash = (vsid & VSID_HASH_MASK) ^ (((uint64_t)addr & ADDR_PIDX) >> + shift); + return (hash & moea64_pteg_mask); +} + +static struct lpte * +mps3_pvo_to_pte(const struct pvo_entry *pvo) +{ + uint64_t slot, vsid; + u_int ptegidx; + + /* If the PTEG index is not set, then there is no page table entry */ + if (!PVO_PTEGIDX_ISSET(pvo)) + return (NULL); + + vsid = PVO_VSID(pvo); + ptegidx = va_to_pteg(vsid, PVO_VADDR(pvo), pvo->pvo_vaddr & PVO_LARGE); + + /* + * We can find the actual pte entry without searching by grabbing + * the PTEG index from 3 unused bits in pvo_vaddr and by + * noticing the HID bit. + */ + if (pvo->pvo_pte.lpte.pte_hi & LPTE_HID) + ptegidx ^= moea64_pteg_mask; + + slot = (ptegidx << 3) | PVO_PTEGIDX_GET(pvo); + + return ((struct lpte *)(slot + 1)); +} + Modified: user/nwhitehorn/ps3/powerpc/ps3/platform_ps3.c ============================================================================== --- user/nwhitehorn/ps3/powerpc/ps3/platform_ps3.c Mon Jul 5 01:12:41 2010 (r209707) +++ user/nwhitehorn/ps3/powerpc/ps3/platform_ps3.c Mon Jul 5 01:14:32 2010 (r209708) @@ -36,12 +36,16 @@ __FBSDID("$FreeBSD: user/nwhitehorn/ps3/ #include #include +#include +#include + #include #include #include #include #include #include +#include #include #include #include @@ -107,7 +111,8 @@ ps3_probe(platform_t plat) static int ps3_attach(platform_t plat) { - boothowto |= RB_VERBOSE; + + pmap_mmu_install("mmu_ps3", BUS_PROBE_SPECIFIC); return (0); } Modified: user/nwhitehorn/ps3/powerpc/ps3/ps3-hvcall.S ============================================================================== --- user/nwhitehorn/ps3/powerpc/ps3/ps3-hvcall.S Mon Jul 5 01:12:41 2010 (r209707) +++ user/nwhitehorn/ps3/powerpc/ps3/ps3-hvcall.S Mon Jul 5 01:14:32 2010 (r209708) @@ -2,11 +2,6 @@ #define hc .long 0x44000022 -/* - * Playstation 3 LV1 hypercall interface - * - * $FreeBSD: user/nwhitehorn/ps3/powerpc/ps3/ps3-hvcall.master 209631 2010-07-01 15:23:29Z nwhitehorn $ - */ ASENTRY(lv1_allocate_memory) mflr %r0 std %r0,16(%r1) @@ -321,15 +316,15 @@ ASENTRY(lv1_construct_logical_spe) std %r0,16(%r1) stdu %r1,-96(%r1) std %r10,48(%r1) - ld %r11,152(%r1) + ld %r11,208(%r1) std %r11,56(%r1) - ld %r11,160(%r1) + ld %r11,216(%r1) std %r11,64(%r1) - ld %r11,168(%r1) + ld %r11,224(%r1) std %r11,72(%r1) - ld %r11,176(%r1) + ld %r11,232(%r1) std %r11,80(%r1) - ld %r11,184(%r1) + ld %r11,240(%r1) std %r11,88(%r1) li %r11,57 hc @@ -477,6 +472,33 @@ ASENTRY(lv1_get_repository_node_value) mtlr %r0 blr +ASENTRY(lv1_read_htab_entries) + mflr %r0 + std %r0,16(%r1) + stdu %r1,-88(%r1) + std %r5,48(%r1) + std %r6,56(%r1) + std %r7,64(%r1) + std %r8,72(%r1) + std %r9,80(%r1) + li %r11,95 + hc + extsw %r3,%r3 + ld %r11,48(%r1) + std %r4,0(%r11) + ld %r11,56(%r1) + std %r5,0(%r11) + ld %r11,64(%r1) + std %r6,0(%r11) + ld %r11,72(%r1) + std %r7,0(%r11) + ld %r11,80(%r1) + std %r8,0(%r11) + ld %r1,0(%r1) + ld %r0,16(%r1) + mtlr %r0 + blr + ASENTRY(lv1_set_dabr) mflr %r0 std %r0,16(%r1) @@ -585,6 +607,28 @@ ASENTRY(lv1_get_version_info) mtlr %r0 blr +ASENTRY(lv1_insert_htab_entry) + mflr %r0 + std %r0,16(%r1) + stdu %r1,-72(%r1) + std %r9,48(%r1) + std %r10,56(%r1) + ld %r11,184(%r1) + std %r11,64(%r1) + li %r11,158 + hc + extsw %r3,%r3 + ld %r11,48(%r1) + std %r4,0(%r11) + ld %r11,56(%r1) + std %r5,0(%r11) + ld %r11,64(%r1) + std %r6,0(%r11) + ld %r1,0(%r1) + ld %r0,16(%r1) + mtlr %r0 + blr + ASENTRY(lv1_read_virtual_uart) mflr %r0 std %r0,16(%r1) Modified: user/nwhitehorn/ps3/powerpc/ps3/ps3-hvcall.h ============================================================================== --- user/nwhitehorn/ps3/powerpc/ps3/ps3-hvcall.h Mon Jul 5 01:12:41 2010 (r209707) +++ user/nwhitehorn/ps3/powerpc/ps3/ps3-hvcall.h Mon Jul 5 01:14:32 2010 (r209708) @@ -1,7 +1,7 @@ /* * Playstation 3 LV1 hypercall interface * - * $FreeBSD: user/nwhitehorn/ps3/powerpc/ps3/ps3-hvcall.master 209631 2010-07-01 15:23:29Z nwhitehorn $ + * $FreeBSD: user/nwhitehorn/ps3/powerpc/ps3/ps3-hvcall.master 209679 2010-07-04 02:40:31Z nwhitehorn $ */ #include @@ -52,6 +52,7 @@ int lv1_get_logical_partition_id(uint64_ int lv1_get_spe_irq_outlet(uint64_t spe_id, uint64_t class, uint64_t *outlet); int lv1_set_spe_privilege_state_area_1_register(uint64_t spe_id, uint64_t offset, uint64_t value); int lv1_get_repository_node_value(uint64_t lpar_id, uint64_t n1, uint64_t n2, uint64_t n3, uint64_t n4, uint64_t *v1, uint64_t *v2); +int lv1_read_htab_entries(uint64_t vas_id, uint64_t slot, uint64_t *hi1, uint64_t *hi2, uint64_t *hi3, uint64_t *hi4, uint64_t *rcbits); int lv1_set_dabr(uint64_t dabr, uint64_t flags); int lv1_allocate_io_segment(uint64_t ioas_id, uint64_t seg_size, uint64_t io_pagesize, uint64_t *ioif_addr); int lv1_release_io_segment(uint64_t ioas_id, uint64_t ioif_addr); @@ -60,6 +61,7 @@ int lv1_destruct_io_irq_outlet(uint64_t int lv1_map_htab(uint64_t lpar_id, uint64_t *htab_addr); int lv1_unmap_htab(uint64_t htab_addr); int lv1_get_version_info(uint64_t *firm_vers); +int lv1_insert_htab_entry(uint64_t vas_id, uint64_t pteg, uint64_t pte_hi, uint64_t pte_lo, uint64_t lockflags, uint64_t flags, uint64_t *index, uint64_t *evicted_hi, uint64_t *evicted_lo); int lv1_read_virtual_uart(uint64_t port, uint64_t buffer, uint64_t bytes, uint64_t *bytes_read); int lv1_write_virtual_uart(uint64_t port, uint64_t buffer, uint64_t bytes, uint64_t *bytes_written); int lv1_set_virtual_uart_param(uint64_t port, uint64_t param, uint64_t value); Modified: user/nwhitehorn/ps3/powerpc/ps3/ps3-hvcall.master ============================================================================== --- user/nwhitehorn/ps3/powerpc/ps3/ps3-hvcall.master Mon Jul 5 01:12:41 2010 (r209707) +++ user/nwhitehorn/ps3/powerpc/ps3/ps3-hvcall.master Mon Jul 5 01:14:32 2010 (r209708) @@ -53,6 +53,7 @@ HVCALL 74 lv1_get_logical_partition_id HVCALL 78 lv1_get_spe_irq_outlet spe_id,class outlet HVCALL 79 lv1_set_spe_privilege_state_area_1_register spe_id,offset,value HVCALL 91 lv1_get_repository_node_value lpar_id,n1,n2,n3,n4 v1,v2 +HVCALL 95 lv1_read_htab_entries vas_id,slot hi1,hi2,hi3,hi4,rcbits HVCALL 96 lv1_set_dabr dabr,flags HVCALL 116 lv1_allocate_io_segment ioas_id,seg_size,io_pagesize ioif_addr HVCALL 117 lv1_release_io_segment ioas_id,ioif_addr @@ -61,6 +62,7 @@ HVCALL 121 lv1_destruct_io_irq_outlet o HVCALL 122 lv1_map_htab lpar_id htab_addr HVCALL 123 lv1_unmap_htab htab_addr HVCALL 127 lv1_get_version_info UNUSED firm_vers +HVCALL 158 lv1_insert_htab_entry vas_id,pteg,pte_hi,pte_lo,lockflags,flags index,evicted_hi,evicted_lo HVCALL 162 lv1_read_virtual_uart port,buffer,bytes bytes_read HVCALL 163 lv1_write_virtual_uart port,buffer,bytes bytes_written HVCALL 164 lv1_set_virtual_uart_param port,param,value From owner-svn-src-user@FreeBSD.ORG Tue Jul 6 10:10:37 2010 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 09EA6106564A; Tue, 6 Jul 2010 10:10:37 +0000 (UTC) (envelope-from jmallett@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id E948B8FC0C; Tue, 6 Jul 2010 10:10:36 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id o66AAadQ037041; Tue, 6 Jul 2010 10:10:36 GMT (envelope-from jmallett@svn.freebsd.org) Received: (from jmallett@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o66AAaiC037012; Tue, 6 Jul 2010 10:10:36 GMT (envelope-from jmallett@svn.freebsd.org) Message-Id: <201007061010.o66AAaiC037012@svn.freebsd.org> From: Juli Mallett Date: Tue, 6 Jul 2010 10:10:36 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r209719 - in user/jmallett/octeon: . bin/sh cddl/contrib/opensolaris/cmd/dtrace/test/cmd/scripts etc/mtree games/fortune/datfiles gnu/usr.bin/gdb/libgdb include/arpa lib/libc/gmon lib/l... X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 06 Jul 2010 10:10:37 -0000 Author: jmallett Date: Tue Jul 6 10:10:35 2010 New Revision: 209719 URL: http://svn.freebsd.org/changeset/base/209719 Log: Merge from head. Added: user/jmallett/octeon/share/man/man4/siftr.4 - copied unchanged from r209718, head/share/man/man4/siftr.4 user/jmallett/octeon/sys/dev/e1000/e1000_mbx.c - copied unchanged from r209718, head/sys/dev/e1000/e1000_mbx.c user/jmallett/octeon/sys/dev/e1000/e1000_mbx.h - copied unchanged from r209718, head/sys/dev/e1000/e1000_mbx.h user/jmallett/octeon/sys/dev/e1000/e1000_vf.c - copied unchanged from r209718, head/sys/dev/e1000/e1000_vf.c user/jmallett/octeon/sys/dev/e1000/e1000_vf.h - copied unchanged from r209718, head/sys/dev/e1000/e1000_vf.h user/jmallett/octeon/sys/modules/siftr/ - copied from r209718, head/sys/modules/siftr/ user/jmallett/octeon/sys/netinet/siftr.c - copied unchanged from r209718, head/sys/netinet/siftr.c user/jmallett/octeon/usr.sbin/pc-sysinstall/Makefile.inc - copied unchanged from r209718, head/usr.sbin/pc-sysinstall/Makefile.inc user/jmallett/octeon/usr.sbin/pc-sysinstall/backend-query/list-config.sh - copied unchanged from r209718, head/usr.sbin/pc-sysinstall/backend-query/list-config.sh user/jmallett/octeon/usr.sbin/pc-sysinstall/backend-query/list-mirrors.sh - copied unchanged from r209718, head/usr.sbin/pc-sysinstall/backend-query/list-mirrors.sh user/jmallett/octeon/usr.sbin/pc-sysinstall/backend/functions-ftp.sh - copied unchanged from r209718, head/usr.sbin/pc-sysinstall/backend/functions-ftp.sh Deleted: user/jmallett/octeon/sys/powerpc/include/intr.h Modified: user/jmallett/octeon/ObsoleteFiles.inc user/jmallett/octeon/bin/sh/expand.c user/jmallett/octeon/bin/sh/jobs.c user/jmallett/octeon/bin/sh/jobs.h user/jmallett/octeon/bin/sh/parser.c user/jmallett/octeon/bin/sh/sh.1 user/jmallett/octeon/etc/mtree/BSD.usr.dist user/jmallett/octeon/games/fortune/datfiles/fortunes-o.real user/jmallett/octeon/gnu/usr.bin/gdb/libgdb/fbsd-threads.c user/jmallett/octeon/include/arpa/inet.h user/jmallett/octeon/lib/libc/gmon/gmon.c user/jmallett/octeon/lib/libc/net/sctp_recvmsg.3 user/jmallett/octeon/lib/libc/net/sctp_send.3 user/jmallett/octeon/lib/libc/net/sctp_sys_calls.c user/jmallett/octeon/lib/libc/posix1e/acl_from_text.c user/jmallett/octeon/lib/libc/sys/getgroups.2 user/jmallett/octeon/lib/libfetch/http.c user/jmallett/octeon/lib/libthread_db/Symbol.map user/jmallett/octeon/lib/libthread_db/libpthread_db.c user/jmallett/octeon/lib/libthread_db/libthr_db.c user/jmallett/octeon/lib/libthread_db/thread_db.c user/jmallett/octeon/lib/libthread_db/thread_db.h user/jmallett/octeon/lib/libthread_db/thread_db_int.h user/jmallett/octeon/sbin/bsdlabel/bsdlabel.c user/jmallett/octeon/sbin/camcontrol/camcontrol.8 user/jmallett/octeon/sbin/devd/devd.cc user/jmallett/octeon/sbin/devd/devd.hh user/jmallett/octeon/sbin/fsck_ffs/suj.c user/jmallett/octeon/sbin/geom/class/multipath/geom_multipath.c user/jmallett/octeon/sbin/mca/mca.c user/jmallett/octeon/sbin/reboot/boot_i386.8 user/jmallett/octeon/share/man/man3/pthread_join.3 user/jmallett/octeon/share/man/man4/Makefile user/jmallett/octeon/share/man/man4/ata.4 user/jmallett/octeon/share/man/man4/bwi.4 user/jmallett/octeon/share/man/man9/Makefile user/jmallett/octeon/share/man/man9/alloc_unr.9 user/jmallett/octeon/share/man/man9/style.9 user/jmallett/octeon/share/man/man9/vm_page_alloc.9 user/jmallett/octeon/share/misc/committers-doc.dot user/jmallett/octeon/sys/amd64/amd64/machdep.c user/jmallett/octeon/sys/amd64/ia32/ia32_signal.c user/jmallett/octeon/sys/amd64/linux32/linux32_sysent.c user/jmallett/octeon/sys/arm/arm/machdep.c user/jmallett/octeon/sys/cam/cam_xpt.c user/jmallett/octeon/sys/compat/freebsd32/freebsd32_misc.c user/jmallett/octeon/sys/compat/freebsd32/freebsd32_proto.h user/jmallett/octeon/sys/compat/freebsd32/freebsd32_signal.h user/jmallett/octeon/sys/compat/freebsd32/freebsd32_syscall.h user/jmallett/octeon/sys/compat/freebsd32/freebsd32_syscalls.c user/jmallett/octeon/sys/compat/freebsd32/freebsd32_sysent.c user/jmallett/octeon/sys/compat/freebsd32/syscalls.master user/jmallett/octeon/sys/compat/linux/linux_signal.c user/jmallett/octeon/sys/compat/svr4/svr4_proto.h user/jmallett/octeon/sys/compat/svr4/svr4_syscall.h user/jmallett/octeon/sys/compat/svr4/svr4_syscallnames.c user/jmallett/octeon/sys/compat/svr4/svr4_sysent.c user/jmallett/octeon/sys/conf/files user/jmallett/octeon/sys/dev/ata/ata-all.c user/jmallett/octeon/sys/dev/ata/ata-all.h user/jmallett/octeon/sys/dev/ata/ata-card.c user/jmallett/octeon/sys/dev/ata/ata-disk.c user/jmallett/octeon/sys/dev/ath/ath_hal/ar5416/ar5416reg.h user/jmallett/octeon/sys/dev/bge/if_bge.c user/jmallett/octeon/sys/dev/bwi/if_bwi.c user/jmallett/octeon/sys/dev/e1000/e1000_82575.h user/jmallett/octeon/sys/dev/e1000/e1000_api.c user/jmallett/octeon/sys/dev/e1000/e1000_api.h user/jmallett/octeon/sys/dev/e1000/e1000_hw.h user/jmallett/octeon/sys/dev/e1000/e1000_regs.h user/jmallett/octeon/sys/dev/e1000/if_igb.c user/jmallett/octeon/sys/dev/e1000/if_igb.h user/jmallett/octeon/sys/dev/ixgbe/ixgbe.c user/jmallett/octeon/sys/dev/ixgbe/ixgbe.h user/jmallett/octeon/sys/dev/mpt/mpt.c user/jmallett/octeon/sys/dev/mpt/mpt.h user/jmallett/octeon/sys/dev/mpt/mpt_cam.c user/jmallett/octeon/sys/dev/mpt/mpt_pci.c user/jmallett/octeon/sys/dev/mpt/mpt_raid.c user/jmallett/octeon/sys/geom/part/g_part.c user/jmallett/octeon/sys/geom/part/g_part.h user/jmallett/octeon/sys/geom/part/g_part_mbr.c user/jmallett/octeon/sys/i386/i386/machdep.c user/jmallett/octeon/sys/i386/ibcs2/ibcs2_proto.h user/jmallett/octeon/sys/i386/ibcs2/ibcs2_syscall.h user/jmallett/octeon/sys/i386/ibcs2/ibcs2_sysent.c user/jmallett/octeon/sys/i386/linux/linux_sysent.c user/jmallett/octeon/sys/ia64/ia64/machdep.c user/jmallett/octeon/sys/ia64/ia64/mca.c user/jmallett/octeon/sys/ia64/ia64/mp_machdep.c user/jmallett/octeon/sys/ia64/include/asm.h user/jmallett/octeon/sys/ia64/include/mca.h user/jmallett/octeon/sys/ia64/include/profile.h user/jmallett/octeon/sys/kern/init_sysent.c user/jmallett/octeon/sys/kern/kern_clock.c user/jmallett/octeon/sys/kern/kern_context.c user/jmallett/octeon/sys/kern/kern_exec.c user/jmallett/octeon/sys/kern/kern_exit.c user/jmallett/octeon/sys/kern/kern_sig.c user/jmallett/octeon/sys/kern/kern_syscalls.c user/jmallett/octeon/sys/kern/kern_thr.c user/jmallett/octeon/sys/kern/makesyscalls.sh user/jmallett/octeon/sys/kern/subr_sleepqueue.c user/jmallett/octeon/sys/kern/subr_trap.c user/jmallett/octeon/sys/kern/subr_unit.c user/jmallett/octeon/sys/kern/sys_generic.c user/jmallett/octeon/sys/kern/sys_process.c user/jmallett/octeon/sys/kern/sys_socket.c user/jmallett/octeon/sys/kern/syscalls.c user/jmallett/octeon/sys/kern/syscalls.master user/jmallett/octeon/sys/kern/sysv_shm.c user/jmallett/octeon/sys/kern/tty.c user/jmallett/octeon/sys/kern/uipc_syscalls.c user/jmallett/octeon/sys/kern/vfs_bio.c user/jmallett/octeon/sys/kern/vfs_vnops.c user/jmallett/octeon/sys/mips/include/pte.h user/jmallett/octeon/sys/mips/mips/pm_machdep.c user/jmallett/octeon/sys/mips/mips/tlb.c user/jmallett/octeon/sys/mips/rmi/board.c user/jmallett/octeon/sys/mips/rmi/board.h user/jmallett/octeon/sys/modules/Makefile user/jmallett/octeon/sys/modules/em/Makefile user/jmallett/octeon/sys/modules/igb/Makefile user/jmallett/octeon/sys/net80211/ieee80211_crypto.h user/jmallett/octeon/sys/net80211/ieee80211_crypto_ccmp.c user/jmallett/octeon/sys/net80211/ieee80211_crypto_tkip.c user/jmallett/octeon/sys/netgraph/ng_ipfw.c user/jmallett/octeon/sys/netinet/ipfw/ip_fw2.c user/jmallett/octeon/sys/netinet/sctp_pcb.c user/jmallett/octeon/sys/netinet/sctputil.c user/jmallett/octeon/sys/pc98/pc98/machdep.c user/jmallett/octeon/sys/powerpc/aim/clock.c user/jmallett/octeon/sys/powerpc/aim/machdep.c user/jmallett/octeon/sys/powerpc/booke/clock.c user/jmallett/octeon/sys/powerpc/booke/machdep.c user/jmallett/octeon/sys/powerpc/include/asm.h user/jmallett/octeon/sys/powerpc/include/profile.h user/jmallett/octeon/sys/powerpc/mpc85xx/atpic.c user/jmallett/octeon/sys/powerpc/mpc85xx/opic.c user/jmallett/octeon/sys/powerpc/powermac/cuda.c user/jmallett/octeon/sys/powerpc/powermac/hrowpic.c user/jmallett/octeon/sys/powerpc/powermac/openpic_macio.c user/jmallett/octeon/sys/powerpc/powermac/pmu.c user/jmallett/octeon/sys/powerpc/powerpc/intr_machdep.c user/jmallett/octeon/sys/powerpc/powerpc/openpic.c user/jmallett/octeon/sys/powerpc/psim/openpic_iobus.c user/jmallett/octeon/sys/sparc64/include/smp.h user/jmallett/octeon/sys/sparc64/sparc64/machdep.c user/jmallett/octeon/sys/sun4v/sun4v/machdep.c user/jmallett/octeon/sys/sys/diskmbr.h user/jmallett/octeon/sys/sys/proc.h user/jmallett/octeon/sys/sys/ptrace.h user/jmallett/octeon/sys/sys/signalvar.h user/jmallett/octeon/sys/sys/syscall.h user/jmallett/octeon/sys/sys/syscall.mk user/jmallett/octeon/sys/sys/syscallsubr.h user/jmallett/octeon/sys/sys/sysent.h user/jmallett/octeon/sys/sys/sysproto.h user/jmallett/octeon/sys/sys/systm.h user/jmallett/octeon/sys/ufs/ffs/ffs_alloc.c user/jmallett/octeon/sys/ufs/ffs/ffs_inode.c user/jmallett/octeon/sys/ufs/ffs/ffs_softdep.c user/jmallett/octeon/sys/ufs/ffs/ffs_vnops.c user/jmallett/octeon/sys/ufs/ffs/softdep.h user/jmallett/octeon/sys/ufs/ufs/inode.h user/jmallett/octeon/sys/ufs/ufs/ufs_inode.c user/jmallett/octeon/sys/ufs/ufs/ufs_lookup.c user/jmallett/octeon/sys/ufs/ufs/ufs_vnops.c user/jmallett/octeon/sys/vm/vm_contig.c user/jmallett/octeon/sys/vm/vm_fault.c user/jmallett/octeon/sys/vm/vm_map.c user/jmallett/octeon/sys/vm/vm_object.c user/jmallett/octeon/sys/vm/vm_page.c user/jmallett/octeon/sys/vm/vm_page.h user/jmallett/octeon/sys/vm/vm_pageout.c user/jmallett/octeon/sys/vm/vm_pager.h user/jmallett/octeon/sys/x86/isa/atrtc.c user/jmallett/octeon/sys/x86/isa/clock.c user/jmallett/octeon/tools/regression/bin/sh/expansion/arith2.0 user/jmallett/octeon/usr.bin/locate/bigram/locate.bigram.c user/jmallett/octeon/usr.bin/locate/code/locate.code.c user/jmallett/octeon/usr.bin/lock/Makefile user/jmallett/octeon/usr.bin/lock/lock.c user/jmallett/octeon/usr.bin/ministat/ministat.1 user/jmallett/octeon/usr.bin/tcopy/Makefile user/jmallett/octeon/usr.bin/tcopy/tcopy.c user/jmallett/octeon/usr.bin/tftp/tftp.c user/jmallett/octeon/usr.sbin/pc-sysinstall/backend-partmanager/Makefile user/jmallett/octeon/usr.sbin/pc-sysinstall/backend-partmanager/create-part.sh user/jmallett/octeon/usr.sbin/pc-sysinstall/backend-partmanager/delete-part.sh user/jmallett/octeon/usr.sbin/pc-sysinstall/backend-query/Makefile user/jmallett/octeon/usr.sbin/pc-sysinstall/backend-query/detect-laptop.sh user/jmallett/octeon/usr.sbin/pc-sysinstall/backend-query/detect-nics.sh user/jmallett/octeon/usr.sbin/pc-sysinstall/backend-query/detect-vmware.sh user/jmallett/octeon/usr.sbin/pc-sysinstall/backend-query/disk-info.sh user/jmallett/octeon/usr.sbin/pc-sysinstall/backend-query/disk-list.sh user/jmallett/octeon/usr.sbin/pc-sysinstall/backend-query/disk-part.sh user/jmallett/octeon/usr.sbin/pc-sysinstall/backend-query/enable-net.sh user/jmallett/octeon/usr.sbin/pc-sysinstall/backend-query/list-components.sh user/jmallett/octeon/usr.sbin/pc-sysinstall/backend-query/list-rsync-backups.sh user/jmallett/octeon/usr.sbin/pc-sysinstall/backend-query/list-tzones.sh user/jmallett/octeon/usr.sbin/pc-sysinstall/backend-query/query-langs.sh user/jmallett/octeon/usr.sbin/pc-sysinstall/backend-query/send-logs.sh user/jmallett/octeon/usr.sbin/pc-sysinstall/backend-query/setup-ssh-keys.sh user/jmallett/octeon/usr.sbin/pc-sysinstall/backend-query/sys-mem.sh user/jmallett/octeon/usr.sbin/pc-sysinstall/backend-query/test-live.sh user/jmallett/octeon/usr.sbin/pc-sysinstall/backend-query/test-netup.sh user/jmallett/octeon/usr.sbin/pc-sysinstall/backend-query/update-part-list.sh user/jmallett/octeon/usr.sbin/pc-sysinstall/backend-query/xkeyboard-layouts.sh user/jmallett/octeon/usr.sbin/pc-sysinstall/backend-query/xkeyboard-models.sh user/jmallett/octeon/usr.sbin/pc-sysinstall/backend-query/xkeyboard-variants.sh user/jmallett/octeon/usr.sbin/pc-sysinstall/backend/Makefile user/jmallett/octeon/usr.sbin/pc-sysinstall/backend/functions-bsdlabel.sh user/jmallett/octeon/usr.sbin/pc-sysinstall/backend/functions-cleanup.sh user/jmallett/octeon/usr.sbin/pc-sysinstall/backend/functions-disk.sh user/jmallett/octeon/usr.sbin/pc-sysinstall/backend/functions-extractimage.sh user/jmallett/octeon/usr.sbin/pc-sysinstall/backend/functions-installcomponents.sh user/jmallett/octeon/usr.sbin/pc-sysinstall/backend/functions-localize.sh user/jmallett/octeon/usr.sbin/pc-sysinstall/backend/functions-mountdisk.sh user/jmallett/octeon/usr.sbin/pc-sysinstall/backend/functions-mountoptical.sh user/jmallett/octeon/usr.sbin/pc-sysinstall/backend/functions-networking.sh user/jmallett/octeon/usr.sbin/pc-sysinstall/backend/functions-newfs.sh user/jmallett/octeon/usr.sbin/pc-sysinstall/backend/functions-parse.sh user/jmallett/octeon/usr.sbin/pc-sysinstall/backend/functions-runcommands.sh user/jmallett/octeon/usr.sbin/pc-sysinstall/backend/functions-unmount.sh user/jmallett/octeon/usr.sbin/pc-sysinstall/backend/functions-upgrade.sh user/jmallett/octeon/usr.sbin/pc-sysinstall/backend/functions-users.sh user/jmallett/octeon/usr.sbin/pc-sysinstall/backend/functions.sh user/jmallett/octeon/usr.sbin/pc-sysinstall/backend/parseconfig.sh user/jmallett/octeon/usr.sbin/pc-sysinstall/backend/startautoinstall.sh user/jmallett/octeon/usr.sbin/pc-sysinstall/conf/pc-sysinstall.conf user/jmallett/octeon/usr.sbin/pc-sysinstall/doc/help-index user/jmallett/octeon/usr.sbin/pc-sysinstall/pc-sysinstall/pc-sysinstall.sh user/jmallett/octeon/usr.sbin/wpa/wpa_supplicant/driver_freebsd.c Directory Properties: user/jmallett/octeon/ (props changed) user/jmallett/octeon/cddl/contrib/opensolaris/cmd/dtrace/test/cmd/scripts/dstyle.pl (props changed) user/jmallett/octeon/cddl/contrib/opensolaris/cmd/dtrace/test/cmd/scripts/dtest.pl (props changed) user/jmallett/octeon/share/mk/bsd.arch.inc.mk (props changed) user/jmallett/octeon/sys/arm/include/bootinfo.h (props changed) Modified: user/jmallett/octeon/ObsoleteFiles.inc ============================================================================== --- user/jmallett/octeon/ObsoleteFiles.inc Tue Jul 6 08:56:34 2010 (r209718) +++ user/jmallett/octeon/ObsoleteFiles.inc Tue Jul 6 10:10:35 2010 (r209719) @@ -14,6 +14,10 @@ # The file is partitioned: OLD_FILES first, then OLD_LIBS and OLD_DIRS last. # +# 20100701: [powerpc] removed +.if ${TARGET_ARCH} == "powerpc" +OLD_FILES+=usr/include/machine/intr.h +.endif # 20100514: library version bump for versioned symbols for liblzma OLD_LIBS+=usr/lib/liblzma.so.0 .if ${TARGET_ARCH} == "amd64" Modified: user/jmallett/octeon/bin/sh/expand.c ============================================================================== --- user/jmallett/octeon/bin/sh/expand.c Tue Jul 6 08:56:34 2010 (r209718) +++ user/jmallett/octeon/bin/sh/expand.c Tue Jul 6 10:10:35 2010 (r209719) @@ -818,7 +818,7 @@ varisset(char *name, int nulok) { if (*name == '!') - return backgndpid != -1; + return backgndpidset(); else if (*name == '@' || *name == '*') { if (*shellparam.p == NULL) return 0; @@ -891,7 +891,7 @@ varvalue(char *name, int quoted, int sub num = shellparam.nparam; goto numvar; case '!': - num = backgndpid; + num = backgndpidval(); numvar: expdest = cvtnum(num, expdest); break; Modified: user/jmallett/octeon/bin/sh/jobs.c ============================================================================== --- user/jmallett/octeon/bin/sh/jobs.c Tue Jul 6 08:56:34 2010 (r209718) +++ user/jmallett/octeon/bin/sh/jobs.c Tue Jul 6 10:10:35 2010 (r209719) @@ -75,6 +75,7 @@ __FBSDID("$FreeBSD$"); STATIC struct job *jobtab; /* array of jobs */ STATIC int njobs; /* size of array */ MKINIT pid_t backgndpid = -1; /* pid of last background process */ +MKINIT struct job *bgjob = NULL; /* last background process */ #if JOBS STATIC struct job *jobmru; /* most recently used job list */ STATIC pid_t initialpgrp; /* pgrp of shell on invocation */ @@ -183,6 +184,7 @@ INCLUDE SHELLPROC { backgndpid = -1; + bgjob = NULL; #if JOBS jobctl = 0; #endif @@ -413,7 +415,11 @@ showjobs(int change, int mode) continue; showjob(jp, 0, mode); jp->changed = 0; - if (jp->state == JOBDONE) { + /* Hack: discard jobs for which $! has not been referenced + * in interactive mode when they terminate. + */ + if (jp->state == JOBDONE && !jp->remembered && + (iflag || jp != bgjob)) { freejob(jp); } } @@ -431,6 +437,8 @@ freejob(struct job *jp) int i; INTOFF; + if (bgjob == jp) + bgjob = NULL; for (i = jp->nprocs, ps = jp->ps ; --i >= 0 ; ps++) { if (ps->cmd != nullstr) ckfree(ps->cmd); @@ -477,12 +485,27 @@ waitcmd(int argc, char **argv) #endif else retval = WTERMSIG(status) + 128; - if (! iflag) + if (! iflag || ! job->changed) freejob(job); + else { + job->remembered = 0; + if (job == bgjob) + bgjob = NULL; + } in_waitcmd--; return retval; } } else { + for (jp = jobtab ; jp < jobtab + njobs; jp++) + if (jp->used && jp->state == JOBDONE) { + if (! iflag || ! jp->changed) + freejob(jp); + else { + jp->remembered = 0; + if (jp == bgjob) + bgjob = NULL; + } + } for (jp = jobtab ; ; jp++) { if (jp >= jobtab + njobs) { /* no running procs */ in_waitcmd--; @@ -623,6 +646,8 @@ makejob(union node *node __unused, int n jp[i].next = &jp[jp[i].next - jobtab]; #endif + if (bgjob != NULL) + bgjob = &jp[bgjob - jobtab]; /* Relocate `ps' pointers */ for (i = 0; i < njobs; i++) if (jp[i].ps == &jobtab[i].ps0) @@ -644,6 +669,7 @@ makejob(union node *node __unused, int n jp->changed = 0; jp->nprocs = 0; jp->foreground = 0; + jp->remembered = 0; #if JOBS jp->jobctl = jobctl; jp->next = NULL; @@ -821,8 +847,13 @@ forkshell(struct job *jp, union node *n, pgrp = jp->ps[0].pid; setpgid(pid, pgrp); } - if (mode == FORK_BG) + if (mode == FORK_BG) { + if (bgjob != NULL && bgjob->state == JOBDONE && + !bgjob->remembered && !iflag) + freejob(bgjob); backgndpid = pid; /* set $! */ + bgjob = jp; + } if (jp) { struct procstat *ps = &jp->ps[jp->nprocs++]; ps->pid = pid; @@ -975,10 +1006,15 @@ dowait(int block, struct job *job) if (jp->state != state) { TRACE(("Job %d: changing state from %d to %d\n", jp - jobtab + 1, jp->state, state)); jp->state = state; + if (jp != job) { + if (done && !jp->remembered && + !iflag && jp != bgjob) + freejob(jp); #if JOBS - if (done) - deljob(jp); + else if (done) + deljob(jp); #endif + } } } } @@ -1074,6 +1110,21 @@ checkzombies(void) } +int +backgndpidset(void) +{ + return backgndpid != -1; +} + + +pid_t +backgndpidval(void) +{ + if (bgjob != NULL) + bgjob->remembered = 1; + return backgndpid; +} + /* * Return a string identifying a command (to be printed by the * jobs command. Modified: user/jmallett/octeon/bin/sh/jobs.h ============================================================================== --- user/jmallett/octeon/bin/sh/jobs.h Tue Jul 6 08:56:34 2010 (r209718) +++ user/jmallett/octeon/bin/sh/jobs.h Tue Jul 6 10:10:35 2010 (r209719) @@ -68,6 +68,7 @@ struct job { char used; /* true if this entry is in used */ char changed; /* true if status has changed */ char foreground; /* true if running in the foreground */ + char remembered; /* true if $! referenced */ #if JOBS char jobctl; /* job running under job control */ struct job *next; /* job used after this one */ @@ -81,7 +82,6 @@ enum { SHOWJOBS_PGIDS /* PID of the group leader only */ }; -extern pid_t backgndpid; /* pid of last background process */ extern int job_warning; /* user was warned about stopped jobs */ extern int in_waitcmd; /* are we in waitcmd()? */ extern int in_dowait; /* are we in dowait()? */ @@ -98,6 +98,8 @@ struct job *makejob(union node *, int); pid_t forkshell(struct job *, union node *, int); int waitforjob(struct job *, int *); int stoppedjobs(void); +int backgndpidset(void); +pid_t backgndpidval(void); char *commandtext(union node *); #if ! JOBS Modified: user/jmallett/octeon/bin/sh/parser.c ============================================================================== --- user/jmallett/octeon/bin/sh/parser.c Tue Jul 6 08:56:34 2010 (r209718) +++ user/jmallett/octeon/bin/sh/parser.c Tue Jul 6 10:10:35 2010 (r209719) @@ -1734,7 +1734,8 @@ getprompt(void *unused __unused) { static char ps[PROMPTLEN]; char *fmt; - int i, j, trim; + const char *pwd; + int i, trim; static char internal_error[] = ""; /* @@ -1785,17 +1786,15 @@ getprompt(void *unused __unused) */ case 'W': case 'w': - ps[i] = '\0'; - getcwd(&ps[i], PROMPTLEN - i); - if (*fmt == 'W' && ps[i + 1] != '\0') { - /* Final path component only. */ - trim = 1; - for (j = i; ps[j] != '\0'; j++) - if (ps[j] == '/') - trim = j + 1; - memmove(&ps[i], &ps[trim], - j - trim + 1); - } + pwd = lookupvar("PWD"); + if (pwd == NULL) + pwd = "?"; + if (*fmt == 'W' && + *pwd == '/' && pwd[1] != '\0') + strlcpy(&ps[i], strrchr(pwd, '/') + 1, + PROMPTLEN - i); + else + strlcpy(&ps[i], pwd, PROMPTLEN - i); /* Skip to end of path. */ while (ps[i + 1] != '\0') i++; Modified: user/jmallett/octeon/bin/sh/sh.1 ============================================================================== --- user/jmallett/octeon/bin/sh/sh.1 Tue Jul 6 08:56:34 2010 (r209718) +++ user/jmallett/octeon/bin/sh/sh.1 Tue Jul 6 10:10:35 2010 (r209719) @@ -32,7 +32,7 @@ .\" from: @(#)sh.1 8.6 (Berkeley) 5/4/95 .\" $FreeBSD$ .\" -.Dd May 24, 2010 +.Dd June 29, 2010 .Dt SH 1 .Os .Sh NAME @@ -1106,6 +1106,10 @@ command executed from the current shell. For a pipeline, the process ID is that of the last command in the pipeline. +If this parameter is referenced, the shell will remember +the process ID and its exit status until the +.Ic wait +built-in command reports completion of the process. .It Li $0 (zero) Expands to the name of the shell or shell script. .El Modified: user/jmallett/octeon/etc/mtree/BSD.usr.dist ============================================================================== --- user/jmallett/octeon/etc/mtree/BSD.usr.dist Tue Jul 6 08:56:34 2010 (r209718) +++ user/jmallett/octeon/etc/mtree/BSD.usr.dist Tue Jul 6 10:10:35 2010 (r209719) @@ -1231,15 +1231,15 @@ pc-sysinstall backend .. - backend-partmanager + backend-partmanager .. - backend-query + backend-query .. - conf + conf license - .. + .. .. - doc + doc .. .. security Modified: user/jmallett/octeon/games/fortune/datfiles/fortunes-o.real ============================================================================== --- user/jmallett/octeon/games/fortune/datfiles/fortunes-o.real Tue Jul 6 08:56:34 2010 (r209718) +++ user/jmallett/octeon/games/fortune/datfiles/fortunes-o.real Tue Jul 6 10:10:35 2010 (r209719) @@ -12433,6 +12433,39 @@ And sure enough she'll take you home and (chorus) -- Crosby, Stills, Nash, "Fair Game" % +Taken from actual police car videos: + +(15) Relax! The handcuffs are tight because they're new. They'll + stretch out after you wear them awhile. +(14) Take your hands off the car and I'll make your birth certificate + a worthless document. +(13) If you run you'll only go to jail tired. +(12) Can you run faster than 1200 feet per second? In case you didn't + know that's the average speed of a 9 mm bullet fired from my gun. +(11) So you don't know how fast you were going. I guess that means I + can write anything I want on the ticket, huh? +(10) Yes, sir, you can talk to the shift supervisor, but I don't think + it will help. Oh, did I mention that I AM the shift supervisor? +(9) Warning? You want a warning? OK, I'm warning you not to do that + again or I'll give you another ticket. +(8) The answer to this last question will determine whether you are + drunk or not. Is Mickey Mouse a cat or a dog? +% +Taken from actual police car videos: + +(7) Fair? You want me to be fair? Listen, fair is a place where you + go to ride on rides, eat cotton candy, and step in monkey poop. +(6) Yeah, we have a quota. Two more tickets and my wife gets a toaster + oven. +(5) No, sir, we don't have quotas anymore. We used to have quotas but + now we're allowed to write as many tickets as we want. +(4) Just how big were those two beers? +(3) In God we trust, all others we run through CPIC/NCIC. +(2) I'm glad to hear the Chief of Police is a good personal friend of + yours. At least you know someone who can post your bail. +(1) You didn't think we gave pretty women tickets? + You're right, we don't -- sign here. +% Taoism: Shit Happens. Confucianism: Confucius say, "Shit Happens". Buddhism: If shit happens, it isn't really shit. Modified: user/jmallett/octeon/gnu/usr.bin/gdb/libgdb/fbsd-threads.c ============================================================================== --- user/jmallett/octeon/gnu/usr.bin/gdb/libgdb/fbsd-threads.c Tue Jul 6 08:56:34 2010 (r209718) +++ user/jmallett/octeon/gnu/usr.bin/gdb/libgdb/fbsd-threads.c Tue Jul 6 10:10:35 2010 (r209719) @@ -1299,6 +1299,7 @@ fbsd_thread_signal_cmd (char *exp, int f td_thrhandle_t th; td_thrinfo_t ti; td_err_e err; + const char *code; if (!fbsd_thread_active || !IS_THREAD(inferior_ptid)) return; @@ -1315,6 +1316,42 @@ fbsd_thread_signal_cmd (char *exp, int f fbsd_print_sigset(&ti.ti_sigmask); printf_filtered("signal pending:\n"); fbsd_print_sigset(&ti.ti_pending); + if (ti.ti_siginfo.si_signo != 0) { + printf_filtered("si_signo %d si_errno %d", ti.ti_siginfo.si_signo, + ti.ti_siginfo.si_errno); + if (ti.ti_siginfo.si_errno != 0) + printf_filtered(" (%s)", strerror(ti.ti_siginfo.si_errno)); + printf_filtered("\n"); + switch (ti.ti_siginfo.si_code) { + case SI_NOINFO: + code = "NOINFO"; + break; + case SI_USER: + code = "USER"; + break; + case SI_QUEUE: + code = "QUEUE"; + break; + case SI_TIMER: + code = "TIMER"; + break; + case SI_ASYNCIO: + code = "ASYNCIO"; + break; + case SI_MESGQ: + code = "MESGQ"; + break; + case SI_KERNEL: + code = "KERNEL"; + break; + default: + code = "UNKNOWN"; + break; + } + printf_filtered("si_code %s si_pid %d si_uid %d si_status %x si_addr %p\n", + code, ti.ti_siginfo.si_pid, ti.ti_siginfo.si_uid, ti.ti_siginfo.si_status, + ti.ti_siginfo.si_addr); + } } static int Modified: user/jmallett/octeon/include/arpa/inet.h ============================================================================== --- user/jmallett/octeon/include/arpa/inet.h Tue Jul 6 08:56:34 2010 (r209718) +++ user/jmallett/octeon/include/arpa/inet.h Tue Jul 6 10:10:35 2010 (r209719) @@ -58,7 +58,7 @@ #ifndef _ARPA_INET_H_ #define _ARPA_INET_H_ -/* External definitions for functions in inet(3), addr2ascii(3) */ +/* External definitions for functions in inet(3). */ #include #include Modified: user/jmallett/octeon/lib/libc/gmon/gmon.c ============================================================================== --- user/jmallett/octeon/lib/libc/gmon/gmon.c Tue Jul 6 08:56:34 2010 (r209718) +++ user/jmallett/octeon/lib/libc/gmon/gmon.c Tue Jul 6 10:10:35 2010 (r209719) @@ -41,6 +41,7 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include #include #include @@ -58,8 +59,8 @@ extern char *minbrk __asm ("minbrk"); struct gmonparam _gmonparam = { GMON_PROF_OFF }; static int s_scale; -/* see profil(2) where this is describe (incorrectly) */ -#define SCALE_1_TO_1 0x10000L +/* See profil(2) where this is described (incorrectly). */ +#define SCALE_SHIFT 16 #define ERR(s) _write(2, s, sizeof(s)) @@ -110,24 +111,8 @@ monstartup(lowpc, highpc) p->tos[0].link = 0; o = p->highpc - p->lowpc; - if (p->kcountsize < o) { -#ifndef hp300 - s_scale = ((float)p->kcountsize / o ) * SCALE_1_TO_1; -#else /* avoid floating point */ - int quot = o / p->kcountsize; - - if (quot >= 0x10000) - s_scale = 1; - else if (quot >= 0x100) - s_scale = 0x10000 / quot; - else if (o >= 0x800000) - s_scale = 0x1000000 / (o / (p->kcountsize >> 8)); - else - s_scale = 0x1000000 / ((o << 8) / p->kcountsize); -#endif - } else - s_scale = SCALE_1_TO_1; - + s_scale = (p->kcountsize < o) ? + ((uintmax_t)p->kcountsize << SCALE_SHIFT) / o : (1 << SCALE_SHIFT); moncontrol(1); } Modified: user/jmallett/octeon/lib/libc/net/sctp_recvmsg.3 ============================================================================== --- user/jmallett/octeon/lib/libc/net/sctp_recvmsg.3 Tue Jul 6 08:56:34 2010 (r209718) +++ user/jmallett/octeon/lib/libc/net/sctp_recvmsg.3 Tue Jul 6 10:10:35 2010 (r209719) @@ -146,14 +146,14 @@ The argument is defined as follows. .Bd -literal struct sctp_sndrcvinfo { - u_int16_t sinfo_stream; /* Stream arriving on */ - u_int16_t sinfo_ssn; /* Stream Sequence Number */ - u_int16_t sinfo_flags; /* Flags on the incoming message */ - u_int32_t sinfo_ppid; /* The ppid field */ - u_int32_t sinfo_context; /* context field */ - u_int32_t sinfo_timetolive; /* not used by sctp_recvmsg */ - u_int32_t sinfo_tsn; /* The transport sequence number */ - u_int32_t sinfo_cumtsn; /* The cumulative acknowledgment point */ + uint16_t sinfo_stream; /* Stream arriving on */ + uint16_t sinfo_ssn; /* Stream Sequence Number */ + uint16_t sinfo_flags; /* Flags on the incoming message */ + uint32_t sinfo_ppid; /* The ppid field */ + uint32_t sinfo_context; /* context field */ + uint32_t sinfo_timetolive; /* not used by sctp_recvmsg */ + uint32_t sinfo_tsn; /* The transport sequence number */ + uint32_t sinfo_cumtsn; /* The cumulative acknowledgment point */ sctp_assoc_t sinfo_assoc_id; /* The association id of the peer */ }; .Ed Modified: user/jmallett/octeon/lib/libc/net/sctp_send.3 ============================================================================== --- user/jmallett/octeon/lib/libc/net/sctp_send.3 Tue Jul 6 08:56:34 2010 (r209718) +++ user/jmallett/octeon/lib/libc/net/sctp_send.3 Tue Jul 6 10:10:35 2010 (r209719) @@ -94,14 +94,14 @@ structure is used to control various SCT and has the following format: .Bd -literal struct sctp_sndrcvinfo { - u_int16_t sinfo_stream; /* Stream sending to */ - u_int16_t sinfo_ssn; /* valid for recv only */ - u_int16_t sinfo_flags; /* flags to control sending */ - u_int32_t sinfo_ppid; /* ppid field */ - u_int32_t sinfo_context; /* context field */ - u_int32_t sinfo_timetolive; /* timetolive for PR-SCTP */ - u_int32_t sinfo_tsn; /* valid for recv only */ - u_int32_t sinfo_cumtsn; /* valid for recv only */ + uint16_t sinfo_stream; /* Stream sending to */ + uint16_t sinfo_ssn; /* valid for recv only */ + uint16_t sinfo_flags; /* flags to control sending */ + uint32_t sinfo_ppid; /* ppid field */ + uint32_t sinfo_context; /* context field */ + uint32_t sinfo_timetolive; /* timetolive for PR-SCTP */ + uint32_t sinfo_tsn; /* valid for recv only */ + uint32_t sinfo_cumtsn; /* valid for recv only */ sctp_assoc_t sinfo_assoc_id; /* The association id */ }; .Ed Modified: user/jmallett/octeon/lib/libc/net/sctp_sys_calls.c ============================================================================== --- user/jmallett/octeon/lib/libc/net/sctp_sys_calls.c Tue Jul 6 08:56:34 2010 (r209718) +++ user/jmallett/octeon/lib/libc/net/sctp_sys_calls.c Tue Jul 6 10:10:35 2010 (r209719) @@ -49,9 +49,9 @@ __FBSDID("$FreeBSD$"); #ifndef IN6_IS_ADDR_V4MAPPED #define IN6_IS_ADDR_V4MAPPED(a) \ - ((*(const u_int32_t *)(const void *)(&(a)->s6_addr[0]) == 0) && \ - (*(const u_int32_t *)(const void *)(&(a)->s6_addr[4]) == 0) && \ - (*(const u_int32_t *)(const void *)(&(a)->s6_addr[8]) == ntohl(0x0000ffff))) + ((*(const uint32_t *)(const void *)(&(a)->s6_addr[0]) == 0) && \ + (*(const uint32_t *)(const void *)(&(a)->s6_addr[4]) == 0) && \ + (*(const uint32_t *)(const void *)(&(a)->s6_addr[8]) == ntohl(0x0000ffff))) #endif @@ -304,7 +304,7 @@ sctp_bindx(int sd, struct sockaddr *addr goto out_error; } - + sa = (struct sockaddr *)((caddr_t)sa + sz); } sa = addrs; /* @@ -533,11 +533,11 @@ sctp_sendmsg(int s, size_t len, const struct sockaddr *to, socklen_t tolen, - u_int32_t ppid, - u_int32_t flags, - u_int16_t stream_no, - u_int32_t timetolive, - u_int32_t context) + uint32_t ppid, + uint32_t flags, + uint16_t stream_no, + uint32_t timetolive, + uint32_t context) { #ifdef SYS_sctp_generic_sendmsg struct sctp_sndrcvinfo sinfo; @@ -814,11 +814,11 @@ sctp_sendmsgx(int sd, size_t len, struct sockaddr *addrs, int addrcnt, - u_int32_t ppid, - u_int32_t flags, - u_int16_t stream_no, - u_int32_t timetolive, - u_int32_t context) + uint32_t ppid, + uint32_t flags, + uint16_t stream_no, + uint32_t timetolive, + uint32_t context) { struct sctp_sndrcvinfo sinfo; Modified: user/jmallett/octeon/lib/libc/posix1e/acl_from_text.c ============================================================================== --- user/jmallett/octeon/lib/libc/posix1e/acl_from_text.c Tue Jul 6 08:56:34 2010 (r209718) +++ user/jmallett/octeon/lib/libc/posix1e/acl_from_text.c Tue Jul 6 10:10:35 2010 (r209719) @@ -271,9 +271,6 @@ error_label: * XXX NOT THREAD SAFE, RELIES ON GETPWNAM, GETGRNAM * XXX USES *PW* AND *GR* WHICH ARE STATEFUL AND THEREFORE THIS ROUTINE * MAY HAVE SIDE-EFFECTS - * - * XXX currently doesn't deal correctly with a numeric uid being passed - * instead of a username. What is correct behavior here? Check chown. */ static int _posix1e_acl_name_to_id(acl_tag_t tag, char *name, uid_t *id) Modified: user/jmallett/octeon/lib/libc/sys/getgroups.2 ============================================================================== --- user/jmallett/octeon/lib/libc/sys/getgroups.2 Tue Jul 6 08:56:34 2010 (r209718) +++ user/jmallett/octeon/lib/libc/sys/getgroups.2 Tue Jul 6 10:10:35 2010 (r209719) @@ -37,7 +37,7 @@ .Sh LIBRARY .Lb libc .Sh SYNOPSIS -.In sys/types.h +.In sys/param.h .In unistd.h .Ft int .Fn getgroups "int gidsetlen" "gid_t *gidset" Modified: user/jmallett/octeon/lib/libfetch/http.c ============================================================================== --- user/jmallett/octeon/lib/libfetch/http.c Tue Jul 6 08:56:34 2010 (r209718) +++ user/jmallett/octeon/lib/libfetch/http.c Tue Jul 6 10:10:35 2010 (r209719) @@ -1786,12 +1786,14 @@ http_request(struct url *URL, const char case hdr_www_authenticate: if (conn->err != HTTP_NEED_AUTH) break; - http_parse_authenticate(p, &server_challenges); + if (http_parse_authenticate(p, &server_challenges)) + ++n; break; case hdr_proxy_authenticate: if (conn->err != HTTP_NEED_PROXY_AUTH) break; - http_parse_authenticate(p, &proxy_challenges); + if (http_parse_authenticate(p, &proxy_challenges) == 0); + ++n; break; case hdr_end: /* fall through */ Modified: user/jmallett/octeon/lib/libthread_db/Symbol.map ============================================================================== --- user/jmallett/octeon/lib/libthread_db/Symbol.map Tue Jul 6 08:56:34 2010 (r209718) +++ user/jmallett/octeon/lib/libthread_db/Symbol.map Tue Jul 6 10:10:35 2010 (r209719) @@ -19,7 +19,6 @@ FBSD_1.0 { td_thr_dbsuspend; td_thr_event_enable; td_thr_event_getmsg; - td_thr_get_info; td_thr_getfpregs; td_thr_getgregs; #if defined(i386) @@ -33,3 +32,7 @@ FBSD_1.0 { td_thr_tls_get_addr; td_thr_validate; }; + +FBSD_1.2 { + td_thr_get_info; +}; Modified: user/jmallett/octeon/lib/libthread_db/libpthread_db.c ============================================================================== --- user/jmallett/octeon/lib/libthread_db/libpthread_db.c Tue Jul 6 08:56:34 2010 (r209718) +++ user/jmallett/octeon/lib/libthread_db/libpthread_db.c Tue Jul 6 10:10:35 2010 (r209719) @@ -570,7 +570,7 @@ pt_thr_validate(const td_thrhandle_t *th } static td_err_e -pt_thr_get_info(const td_thrhandle_t *th, td_thrinfo_t *info) +pt_thr_old_get_info(const td_thrhandle_t *th, td_old_thrinfo_t *info) { const td_thragent_t *ta = th->th_ta; struct ptrace_lwpinfo linfo; @@ -659,6 +659,16 @@ pt_thr_get_info(const td_thrhandle_t *th return (0); } +static td_err_e +pt_thr_get_info(const td_thrhandle_t *th, td_thrinfo_t *info) +{ + td_err_e e; + + e = pt_thr_old_get_info(th, (td_old_thrinfo_t *)info); + bzero(&info->ti_siginfo, sizeof(info->ti_siginfo)); + return (e); +} + #ifdef __i386__ static td_err_e pt_thr_getxmmregs(const td_thrhandle_t *th, char *fxsave) @@ -1114,6 +1124,7 @@ struct ta_ops libpthread_db_ops = { .to_thr_dbsuspend = pt_thr_dbsuspend, .to_thr_event_enable = pt_thr_event_enable, .to_thr_event_getmsg = pt_thr_event_getmsg, + .to_thr_old_get_info = pt_thr_old_get_info, .to_thr_get_info = pt_thr_get_info, .to_thr_getfpregs = pt_thr_getfpregs, .to_thr_getgregs = pt_thr_getgregs, Modified: user/jmallett/octeon/lib/libthread_db/libthr_db.c ============================================================================== --- user/jmallett/octeon/lib/libthread_db/libthr_db.c Tue Jul 6 08:56:34 2010 (r209718) +++ user/jmallett/octeon/lib/libthread_db/libthr_db.c Tue Jul 6 10:10:35 2010 (r209719) @@ -453,7 +453,7 @@ pt_thr_validate(const td_thrhandle_t *th } static td_err_e -pt_thr_get_info(const td_thrhandle_t *th, td_thrinfo_t *info) +pt_thr_get_info_common(const td_thrhandle_t *th, td_thrinfo_t *info, int old) { const td_thragent_t *ta = th->th_ta; struct ptrace_lwpinfo linfo; @@ -489,6 +489,13 @@ pt_thr_get_info(const td_thrhandle_t *th if (ret == PS_OK) { info->ti_sigmask = linfo.pl_sigmask; info->ti_pending = linfo.pl_siglist; + if (!old) { + if ((linfo.pl_flags & PL_FLAG_SI) != 0) + info->ti_siginfo = linfo.pl_siginfo; + else + bzero(&info->ti_siginfo, + sizeof(info->ti_siginfo)); + } } else return (ret); if (state == ta->thread_state_running) @@ -501,6 +508,20 @@ pt_thr_get_info(const td_thrhandle_t *th return (0); } +static td_err_e +pt_thr_old_get_info(const td_thrhandle_t *th, td_old_thrinfo_t *info) +{ + + return (pt_thr_get_info_common(th, (td_thrinfo_t *)info, 1)); +} + +static td_err_e +pt_thr_get_info(const td_thrhandle_t *th, td_thrinfo_t *info) +{ + + return (pt_thr_get_info_common(th, info, 0)); +} + #ifdef __i386__ static td_err_e pt_thr_getxmmregs(const td_thrhandle_t *th, char *fxsave) @@ -761,6 +782,7 @@ struct ta_ops libthr_db_ops = { .to_thr_dbsuspend = pt_thr_dbsuspend, .to_thr_event_enable = pt_thr_event_enable, .to_thr_event_getmsg = pt_thr_event_getmsg, + .to_thr_old_get_info = pt_thr_old_get_info, .to_thr_get_info = pt_thr_get_info, .to_thr_getfpregs = pt_thr_getfpregs, .to_thr_getgregs = pt_thr_getgregs, Modified: user/jmallett/octeon/lib/libthread_db/thread_db.c ============================================================================== --- user/jmallett/octeon/lib/libthread_db/thread_db.c Tue Jul 6 08:56:34 2010 (r209718) +++ user/jmallett/octeon/lib/libthread_db/thread_db.c Tue Jul 6 10:10:35 2010 (r209719) @@ -176,6 +176,14 @@ td_thr_event_getmsg(const td_thrhandle_t } td_err_e +td_thr_old_get_info(const td_thrhandle_t *th, td_old_thrinfo_t *info) +{ + const td_thragent_t *ta = th->th_ta; + return (ta->ta_ops->to_thr_old_get_info(th, info)); +} +__sym_compat(td_thr_get_info, td_thr_old_get_info, FBSD_1.0); + +td_err_e td_thr_get_info(const td_thrhandle_t *th, td_thrinfo_t *info) { const td_thragent_t *ta = th->th_ta; Modified: user/jmallett/octeon/lib/libthread_db/thread_db.h ============================================================================== --- user/jmallett/octeon/lib/libthread_db/thread_db.h Tue Jul 6 08:56:34 2010 (r209718) +++ user/jmallett/octeon/lib/libthread_db/thread_db.h Tue Jul 6 10:10:35 2010 (r209719) @@ -191,6 +191,7 @@ typedef struct { psaddr_t ti_startfunc; psaddr_t ti_stkbase; size_t ti_stksize; + siginfo_t ti_siginfo; } td_thrinfo_t; /* Modified: user/jmallett/octeon/lib/libthread_db/thread_db_int.h ============================================================================== --- user/jmallett/octeon/lib/libthread_db/thread_db_int.h Tue Jul 6 08:56:34 2010 (r209718) +++ user/jmallett/octeon/lib/libthread_db/thread_db_int.h Tue Jul 6 10:10:35 2010 (r209719) @@ -32,6 +32,25 @@ #include #include +typedef struct { + const td_thragent_t *ti_ta_p; + thread_t ti_tid; + psaddr_t ti_thread; + td_thr_state_e ti_state; + td_thr_type_e ti_type; + td_thr_events_t ti_events; + int ti_pri; + lwpid_t ti_lid; + char ti_db_suspended; + char ti_traceme; + sigset_t ti_sigmask; + sigset_t ti_pending; + psaddr_t ti_tls; + psaddr_t ti_startfunc; + psaddr_t ti_stkbase; + size_t ti_stksize; +} td_old_thrinfo_t; + #define TD_THRAGENT_FIELDS \ struct ta_ops *ta_ops; \ TAILQ_ENTRY(td_thragent) ta_next; \ @@ -65,6 +84,8 @@ struct ta_ops { td_err_e (*to_thr_event_enable)(const td_thrhandle_t *, int); td_err_e (*to_thr_event_getmsg)(const td_thrhandle_t *, td_event_msg_t *); + td_err_e (*to_thr_old_get_info)(const td_thrhandle_t *, + td_old_thrinfo_t *); td_err_e (*to_thr_get_info)(const td_thrhandle_t *, td_thrinfo_t *); td_err_e (*to_thr_getfpregs)(const td_thrhandle_t *, prfpregset_t *); td_err_e (*to_thr_getgregs)(const td_thrhandle_t *, prgregset_t); @@ -103,4 +124,6 @@ int thr_pwrite_int(const struct td_thrag int thr_pwrite_long(const struct td_thragent *, psaddr_t, uint64_t); int thr_pwrite_ptr(const struct td_thragent *, psaddr_t, psaddr_t); +td_err_e td_thr_old_get_info(const td_thrhandle_t *th, td_old_thrinfo_t *info); + #endif /* _THREAD_DB_INT_H_ */ Modified: user/jmallett/octeon/sbin/bsdlabel/bsdlabel.c ============================================================================== --- user/jmallett/octeon/sbin/bsdlabel/bsdlabel.c Tue Jul 6 08:56:34 2010 (r209718) +++ user/jmallett/octeon/sbin/bsdlabel/bsdlabel.c Tue Jul 6 10:10:35 2010 (r209719) @@ -347,7 +347,7 @@ makelabel(const char *type, struct diskl static void readboot(void) { - int fd, i; + int fd; struct stat st; uint64_t *p; @@ -358,8 +358,7 @@ readboot(void) err(1, "cannot open %s", xxboot); fstat(fd, &st); if (alphacksum && st.st_size <= BBSIZE - 512) { - i = read(fd, bootarea + 512, st.st_size); - if (i != st.st_size) + if (read(fd, bootarea + 512, st.st_size) != st.st_size) err(1, "read error %s", xxboot); /* @@ -372,8 +371,7 @@ readboot(void) p[62] = 0; return; } else if ((!alphacksum) && st.st_size <= BBSIZE) { - i = read(fd, bootarea, st.st_size); - if (i != st.st_size) + if (read(fd, bootarea, st.st_size) != st.st_size) err(1, "read error %s", xxboot); return; } @@ -479,6 +477,7 @@ get_file_parms(int f) static int readlabel(int flag) { + ssize_t nbytes; uint32_t lba; int f, i; int error; @@ -498,8 +497,11 @@ readlabel(int flag) errx(1, "disks with more than 2^32-1 sectors are not supported"); (void)lseek(f, (off_t)0, SEEK_SET); - if (read(f, bootarea, BBSIZE) != BBSIZE) + nbytes = read(f, bootarea, BBSIZE); + if (nbytes == -1) err(4, "%s read", specname); + if (nbytes != BBSIZE) + errx(4, "couldn't read %d bytes from %s", BBSIZE, specname); close (f); error = bsd_disklabel_le_dec( bootarea + (labeloffset + labelsoffset * secsize), Modified: user/jmallett/octeon/sbin/camcontrol/camcontrol.8 ============================================================================== --- user/jmallett/octeon/sbin/camcontrol/camcontrol.8 Tue Jul 6 08:56:34 2010 (r209718) +++ user/jmallett/octeon/sbin/camcontrol/camcontrol.8 Tue Jul 6 10:10:35 2010 (r209719) @@ -27,7 +27,7 @@ .\" .\" $FreeBSD$ .\" -.Dd May 2, 2010 +.Dd July 1, 2010 .Dt CAMCONTROL 8 .Os .Sh NAME @@ -846,11 +846,13 @@ will not be asked about the timeout if a command line. .El .It Ic idle -Put ATA device into IDLE state. Optional parameter specifies automatic -idle timer value in seconds. +Put ATA device into IDLE state. Optional parameter +.Pq Fl t +specifies automatic standby timer value in seconds. Value 0 disables timer. .It Ic standby -Put ATA device into STANDBY state. Optional parameter specifies automatic -standby timer value in seconds. +Put ATA device into STANDBY state. Optional parameter +.Pq Fl t +specifies automatic standby timer value in seconds. Value 0 disables timer. .It Ic sleep Put ATA device into SLEEP state. Note that the only way get device out of this state may be reset. Modified: user/jmallett/octeon/sbin/devd/devd.cc ============================================================================== --- user/jmallett/octeon/sbin/devd/devd.cc Tue Jul 6 08:56:34 2010 (r209718) +++ user/jmallett/octeon/sbin/devd/devd.cc Tue Jul 6 10:10:35 2010 (r209719) @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2002-2003 M. Warner Losh. + * Copyright (c) 2002-2010 M. Warner Losh. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -22,6 +22,35 @@ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. + * + * my_system is a variation on lib/libc/stdlib/system.c: + * + * Copyright (c) 1988, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. */ /* @@ -41,6 +70,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include @@ -49,6 +79,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -152,13 +183,67 @@ action::~action() // nothing } +static int +my_system(const char *command) +{ + pid_t pid, savedpid; + int pstat; + struct sigaction ign, intact, quitact; + sigset_t newsigblock, oldsigblock; + + if (!command) /* just checking... */ + return(1); + + /* + * Ignore SIGINT and SIGQUIT, block SIGCHLD. Remember to save + * existing signal dispositions. + */ + ign.sa_handler = SIG_IGN; + ::sigemptyset(&ign.sa_mask); + ign.sa_flags = 0; + ::sigaction(SIGINT, &ign, &intact); + ::sigaction(SIGQUIT, &ign, &quitact); + ::sigemptyset(&newsigblock); + ::sigaddset(&newsigblock, SIGCHLD); + ::sigprocmask(SIG_BLOCK, &newsigblock, &oldsigblock); + switch (pid = ::fork()) { + case -1: /* error */ + break; + case 0: /* child */ + /* + * Restore original signal dispositions and exec the command. + */ + ::sigaction(SIGINT, &intact, NULL); + ::sigaction(SIGQUIT, &quitact, NULL); + ::sigprocmask(SIG_SETMASK, &oldsigblock, NULL); + /* + * Close the PID file, and all other open descriptors. + * Inherit std{in,out,err} only. + */ + cfg.close_pidfile(); + ::closefrom(3); + ::execl(_PATH_BSHELL, "sh", "-c", command, (char *)NULL); + ::_exit(127); + default: /* parent */ + savedpid = pid; + do { + pid = ::wait4(savedpid, &pstat, 0, (struct rusage *)0); + } while (pid == -1 && errno == EINTR); + break; + } + ::sigaction(SIGINT, &intact, NULL); + ::sigaction(SIGQUIT, &quitact, NULL); + ::sigprocmask(SIG_SETMASK, &oldsigblock, NULL); + return (pid == -1 ? -1 : pstat); +} + bool action::do_action(config &c) { string s = c.expand_string(_cmd); if (Dflag) fprintf(stderr, "Executing '%s'\n", s.c_str()); - ::system(s.c_str()); + my_system(s.c_str()); return (true); } @@ -391,6 +476,13 @@ config::write_pidfile() } void +config::close_pidfile() +{ + + pidfile_close(pfh); +} + +void config::remove_pidfile() { Modified: user/jmallett/octeon/sbin/devd/devd.hh ============================================================================== --- user/jmallett/octeon/sbin/devd/devd.hh Tue Jul 6 08:56:34 2010 (r209718) +++ user/jmallett/octeon/sbin/devd/devd.hh Tue Jul 6 10:10:35 2010 (r209719) @@ -153,6 +153,7 @@ public: void set_pidfile(const char *); void reset(); void parse(); + void close_pidfile(); *** DIFF OUTPUT TRUNCATED AT 1000 LINES *** From owner-svn-src-user@FreeBSD.ORG Wed Jul 7 10:55:13 2010 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id AB22F106566B; Wed, 7 Jul 2010 10:55:13 +0000 (UTC) (envelope-from jmallett@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 9ADB48FC36; Wed, 7 Jul 2010 10:55:13 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id o67AtD1I068656; Wed, 7 Jul 2010 10:55:13 GMT (envelope-from jmallett@svn.freebsd.org) Received: (from jmallett@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o67AtDAj068654; Wed, 7 Jul 2010 10:55:13 GMT (envelope-from jmallett@svn.freebsd.org) Message-Id: <201007071055.o67AtDAj068654@svn.freebsd.org> From: Juli Mallett Date: Wed, 7 Jul 2010 10:55:13 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r209759 - user/jmallett/octeon/sys/mips/include X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 07 Jul 2010 10:55:13 -0000 Author: jmallett Date: Wed Jul 7 10:55:13 2010 New Revision: 209759 URL: http://svn.freebsd.org/changeset/base/209759 Log: Fix typo from hand-merge. Modified: user/jmallett/octeon/sys/mips/include/pte.h Modified: user/jmallett/octeon/sys/mips/include/pte.h ============================================================================== --- user/jmallett/octeon/sys/mips/include/pte.h Wed Jul 7 09:23:46 2010 (r209758) +++ user/jmallett/octeon/sys/mips/include/pte.h Wed Jul 7 10:55:13 2010 (r209759) @@ -101,7 +101,7 @@ typedef pt_entry_t *pd_entry_t; (TLBHI_VA_TO_VPN2((va))) /* VPN2. */ | \ ((asid) & TLBHI_ASID_MASK)) #else -#define TLBHI_ENTRY(va, asid) (((va) & ~(1 << TLBHI_VPN2_SHIFT)) | ((asid) & TLBHI_ASID_MASK)) +#define TLBHI_ENTRY(va, asid) (((va) & ~((1ULL << TLBHI_VPN2_SHIFT) - 1)) | ((asid) & TLBHI_ASID_MASK)) #endif /* From owner-svn-src-user@FreeBSD.ORG Wed Jul 7 12:04:57 2010 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 873271065670; Wed, 7 Jul 2010 12:04:57 +0000 (UTC) (envelope-from jmallett@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 766468FC1F; Wed, 7 Jul 2010 12:04:57 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id o67C4vuT084116; Wed, 7 Jul 2010 12:04:57 GMT (envelope-from jmallett@svn.freebsd.org) Received: (from jmallett@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o67C4v6Q084114; Wed, 7 Jul 2010 12:04:57 GMT (envelope-from jmallett@svn.freebsd.org) Message-Id: <201007071204.o67C4v6Q084114@svn.freebsd.org> From: Juli Mallett Date: Wed, 7 Jul 2010 12:04:57 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r209762 - user/jmallett/octeon/sys/mips/mips X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 07 Jul 2010 12:04:57 -0000 Author: jmallett Date: Wed Jul 7 12:04:56 2010 New Revision: 209762 URL: http://svn.freebsd.org/changeset/base/209762 Log: Simplify code some and correct a few bugs and omissions related to unaligned accesses. There still seems to be something not quite right here, but this should fix problems related to useracc failing when the access could have been fixed up (due to always assuming word access width in useracc even for halfword unaligned accesses), as well as providing unaligned ld/sd fixup. Modified: user/jmallett/octeon/sys/mips/mips/trap.c Modified: user/jmallett/octeon/sys/mips/mips/trap.c ============================================================================== --- user/jmallett/octeon/sys/mips/mips/trap.c Wed Jul 7 12:00:11 2010 (r209761) +++ user/jmallett/octeon/sys/mips/mips/trap.c Wed Jul 7 12:04:56 2010 (r209762) @@ -259,7 +259,7 @@ static int allow_unaligned_acc = 1; SYSCTL_INT(_vm, OID_AUTO, allow_unaligned_acc, CTLFLAG_RW, &allow_unaligned_acc, 0, "Allow unaligned accesses"); -static int emulate_unaligned_access(struct trapframe *frame); +static int emulate_unaligned_access(struct trapframe *frame, int mode); extern void fswintrberr(void); /* XXX */ @@ -563,21 +563,9 @@ dofault: else mode = VM_PROT_WRITE; - /* - * ADDR_ERR faults have higher priority than TLB - * Miss faults. Therefore, it is necessary to - * verify that the faulting address is a valid - * virtual address within the process' address space - * before trying to emulate the unaligned access. - */ - if (useracc((caddr_t) - (((vm_offset_t)trapframe->badvaddr) & - ~(sizeof(int) - 1)), sizeof(int) * 2, mode)) { - access_type = emulate_unaligned_access( - trapframe); - if (access_type != 0) - goto out; - } + access_type = emulate_unaligned_access(trapframe, mode); + if (access_type != 0) + goto out; } msg = "ADDRESS_ERR"; @@ -949,22 +937,9 @@ dofault: else mode = VM_PROT_WRITE; - /* - * ADDR_ERR faults have higher priority than TLB - * Miss faults. Therefore, it is necessary to - * verify that the faulting address is a valid - * virtual address within the process' address space - * before trying to emulate the unaligned access. - */ - if (useracc((caddr_t) - (((vm_offset_t)trapframe->badvaddr) & - ~(sizeof(int) - 1)), sizeof(int) * 2, mode)) { - access_type = emulate_unaligned_access( - trapframe); - if (access_type != 0) { - return (trapframe->pc); - } - } + access_type = emulate_unaligned_access(trapframe, mode); + if (access_type != 0) + return (trapframe->pc); } /* FALLTHROUGH */ @@ -1429,76 +1404,120 @@ log_bad_page_fault(char *msg, struct tra * Unaligned load/store emulation */ static int -mips_unaligned_load_store(struct trapframe *frame, register_t addr, register_t pc) +mips_unaligned_load_store(struct trapframe *frame, int mode, register_t addr, register_t pc) { register_t *reg = (register_t *) frame; u_int32_t inst = *((u_int32_t *)(intptr_t)pc); - u_int32_t value_msb, value; - int access_type = 0; + register_t value_msb, value; + unsigned size; + + /* + * ADDR_ERR faults have higher priority than TLB + * Miss faults. Therefore, it is necessary to + * verify that the faulting address is a valid + * virtual address within the process' address space + * before trying to emulate the unaligned access. + */ + switch (MIPS_INST_OPCODE(inst)) { + case OP_LHU: case OP_LH: + case OP_SH: + size = 2; + break; + case OP_LWU: case OP_LW: + case OP_SW: + size = 4; + break; + case OP_LD: + case OP_SD: + size = 8; + break; + default: + printf("%s: unhandled opcode in address error: %#x\n", __func__, MIPS_INST_OPCODE(inst)); + return (0); + } + if (!useracc((void *)((vm_offset_t)addr & ~(size - 1)), size * 2, mode)) + return (0); + + /* + * XXX + * Handle LL/SC LLD/SCD. + */ switch (MIPS_INST_OPCODE(inst)) { case OP_LHU: + KASSERT(mode == VM_PROT_READ, ("access mode must be read for load instruction.")); lbu_macro(value_msb, addr); addr += 1; lbu_macro(value, addr); value |= value_msb << 8; reg[MIPS_INST_RT(inst)] = value; - access_type = MIPS_LHU_ACCESS; - break; + return (MIPS_LHU_ACCESS); case OP_LH: + KASSERT(mode == VM_PROT_READ, ("access mode must be read for load instruction.")); lb_macro(value_msb, addr); addr += 1; lbu_macro(value, addr); value |= value_msb << 8; reg[MIPS_INST_RT(inst)] = value; - access_type = MIPS_LH_ACCESS; - break; + return (MIPS_LH_ACCESS); case OP_LWU: + KASSERT(mode == VM_PROT_READ, ("access mode must be read for load instruction.")); lwl_macro(value, addr); addr += 3; lwr_macro(value, addr); value &= 0xffffffff; reg[MIPS_INST_RT(inst)] = value; - access_type = MIPS_LWU_ACCESS; - break; + return (MIPS_LWU_ACCESS); case OP_LW: + KASSERT(mode == VM_PROT_READ, ("access mode must be read for load instruction.")); lwl_macro(value, addr); addr += 3; lwr_macro(value, addr); reg[MIPS_INST_RT(inst)] = value; - access_type = MIPS_LW_ACCESS; - break; + return (MIPS_LW_ACCESS); + + case OP_LD: + KASSERT(mode == VM_PROT_READ, ("access mode must be read for load instruction.")); + ldl_macro(value, addr); + addr += 7; + ldr_macro(value, addr); + reg[MIPS_INST_RT(inst)] = value; + return (MIPS_LD_ACCESS); case OP_SH: + KASSERT(mode == VM_PROT_WRITE, ("access mode must be write for store instruction.")); value = reg[MIPS_INST_RT(inst)]; value_msb = value >> 8; sb_macro(value_msb, addr); addr += 1; sb_macro(value, addr); - access_type = MIPS_SH_ACCESS; - break; + return (MIPS_SH_ACCESS); case OP_SW: + KASSERT(mode == VM_PROT_WRITE, ("access mode must be write for store instruction.")); value = reg[MIPS_INST_RT(inst)]; swl_macro(value, addr); addr += 3; swr_macro(value, addr); - access_type = MIPS_SW_ACCESS; - break; + return (MIPS_SW_ACCESS); - default: - break; + case OP_SD: + KASSERT(mode == VM_PROT_WRITE, ("access mode must be write for store instruction.")); + value = reg[MIPS_INST_RT(inst)]; + sdl_macro(value, addr); + addr += 7; + sdr_macro(value, addr); + return (MIPS_SD_ACCESS); } - - return access_type; + panic("%s: should not be reached.", __func__); } static int -emulate_unaligned_access(struct trapframe *frame) +emulate_unaligned_access(struct trapframe *frame, int mode) { register_t pc; int access_type = 0; @@ -1519,7 +1538,7 @@ emulate_unaligned_access(struct trapfram * Otherwise restore pc and fall through. */ access_type = mips_unaligned_load_store(frame, - frame->badvaddr, pc); + mode, frame->badvaddr, pc); if (access_type) { if (DELAYBRANCH(frame->cause)) From owner-svn-src-user@FreeBSD.ORG Thu Jul 8 04:04:27 2010 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id D8474106564A; Thu, 8 Jul 2010 04:04:27 +0000 (UTC) (envelope-from jmallett@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id BC0718FC12; Thu, 8 Jul 2010 04:04:27 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id o6844RYR097671; Thu, 8 Jul 2010 04:04:27 GMT (envelope-from jmallett@svn.freebsd.org) Received: (from jmallett@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o6844R4s097669; Thu, 8 Jul 2010 04:04:27 GMT (envelope-from jmallett@svn.freebsd.org) Message-Id: <201007080404.o6844R4s097669@svn.freebsd.org> From: Juli Mallett Date: Thu, 8 Jul 2010 04:04:27 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r209791 - user/jmallett/octeon/sys/mips/mips X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 08 Jul 2010 04:04:28 -0000 Author: jmallett Date: Thu Jul 8 04:04:27 2010 New Revision: 209791 URL: http://svn.freebsd.org/changeset/base/209791 Log: o) Allow changing trap_debug at runtime and set it to 0 by default if TRAP_DEBUG is defined. o) Crash user programs that try to access kernel addresses rather than kindly fixing them up as though they were misaligned and rather than generating kernel-level addresses errors and eventually panicking by trying to access addresses that are outright invalid, crash the user program. Modified: user/jmallett/octeon/sys/mips/mips/trap.c Modified: user/jmallett/octeon/sys/mips/mips/trap.c ============================================================================== --- user/jmallett/octeon/sys/mips/mips/trap.c Thu Jul 8 03:41:57 2010 (r209790) +++ user/jmallett/octeon/sys/mips/mips/trap.c Thu Jul 8 04:04:27 2010 (r209791) @@ -96,7 +96,9 @@ __FBSDID("$FreeBSD$"); #ifdef TRAP_DEBUG -int trap_debug = 1; +int trap_debug = 0; +SYSCTL_INT(_machdep, OID_AUTO, trap_debug, CTLFLAG_RW, + &trap_debug, 0, "Debug information on all traps"); #endif static void log_illegal_instruction(const char *, struct trapframe *); @@ -555,7 +557,10 @@ dofault: case T_ADDR_ERR_LD + T_USER: /* misaligned or kseg access */ case T_ADDR_ERR_ST + T_USER: /* misaligned or kseg access */ - if (allow_unaligned_acc) { + if (trapframe->badvaddr < 0 || + trapframe->badvaddr >= VM_MAXUSER_ADDRESS) { + msg = "ADDRESS_SPACE_ERR"; + } else if (allow_unaligned_acc) { int mode; if (type == (T_ADDR_ERR_LD + T_USER)) @@ -566,8 +571,10 @@ dofault: access_type = emulate_unaligned_access(trapframe, mode); if (access_type != 0) goto out; + msg = "ALIGNMENT_FIX_ERR"; + } else { + msg = "ADDRESS_ERR"; } - msg = "ADDRESS_ERR"; /* FALL THROUGH */ @@ -674,7 +681,9 @@ dofault: #endif } #ifdef TRAP_DEBUG - printf("SYSCALL #%d pid:%u\n", code, p->p_pid); + if (trap_debug) { + printf("SYSCALL #%d pid:%u\n", code, p->p_pid); + } #endif if (p->p_sysent->sv_mask) @@ -711,8 +720,10 @@ dofault: } } #ifdef TRAP_DEBUG - for (i = 0; i < nargs; i++) { - printf("args[%d] = %#jx\n", i, (intmax_t)args[i]); + if (trap_debug) { + for (i = 0; i < nargs; i++) { + printf("args[%d] = %#jx\n", i, (intmax_t)args[i]); + } } #endif #ifdef SYSCALL_TRACING @@ -924,8 +935,10 @@ dofault: case T_ADDR_ERR_LD: /* misaligned access */ case T_ADDR_ERR_ST: /* misaligned access */ #ifdef TRAP_DEBUG - printf("+++ ADDR_ERR: type = %d, badvaddr = %#jx\n", type, - (intmax_t)trapframe->badvaddr); + if (trap_debug) { + printf("+++ ADDR_ERR: type = %d, badvaddr = %#jx\n", type, + (intmax_t)trapframe->badvaddr); + } #endif /* Only allow emulation on a user address */ if (allow_unaligned_acc && @@ -971,9 +984,10 @@ err: printf("kernel mode)\n"); #ifdef TRAP_DEBUG - printf("badvaddr = %#jx, pc = %#jx, ra = %#jx, sr = %#jxx\n", - (intmax_t)trapframe->badvaddr, (intmax_t)trapframe->pc, (intmax_t)trapframe->ra, - (intmax_t)trapframe->sr); + if (trap_debug) + printf("badvaddr = %#jx, pc = %#jx, ra = %#jx, sr = %#jxx\n", + (intmax_t)trapframe->badvaddr, (intmax_t)trapframe->pc, (intmax_t)trapframe->ra, + (intmax_t)trapframe->sr); #endif #ifdef KDB