From owner-freebsd-arch@FreeBSD.ORG Sun Jun 19 00:53:28 2005 Return-Path: X-Original-To: freebsd-arch@freebsd.org Delivered-To: freebsd-arch@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 78FA816A41C for ; Sun, 19 Jun 2005 00:53:28 +0000 (GMT) (envelope-from danny280279@hotmail.com) Received: from hotmail.com (bay104-f6.bay104.hotmail.com [65.54.175.16]) by mx1.FreeBSD.org (Postfix) with ESMTP id 64CD843D1D for ; Sun, 19 Jun 2005 00:53:28 +0000 (GMT) (envelope-from danny280279@hotmail.com) Received: from mail pickup service by hotmail.com with Microsoft SMTPSVC; Sat, 18 Jun 2005 17:53:28 -0700 Message-ID: Received: from 65.54.175.202 by by104fd.bay104.hotmail.msn.com with HTTP; Sun, 19 Jun 2005 00:53:28 GMT X-Originating-IP: [65.54.175.202] X-Originating-Email: [danny280279@hotmail.com] X-Sender: danny280279@hotmail.com From: "DANIEL hoggan" To: freebsd-arch@freebsd.org Date: Sun, 19 Jun 2005 00:53:28 +0000 Mime-Version: 1.0 Content-Type: text/plain; format=flowed X-OriginalArrivalTime: 19 Jun 2005 00:53:28.0424 (UTC) FILETIME=[4E50E680:01C57469] Subject: Standard GUI for UNIX at the system level X-BeenThere: freebsd-arch@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Discussion related to FreeBSD architecture List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 19 Jun 2005 00:53:28 -0000 Is there any reason as to why X cannot be rewrote to be the standard interface to UNIX? If there is please tell me so that I don't bug everyone on this list with pointless questions about upgrading the X interface so that it accepts PDF protocols for it's rendering capabilities. OR about adding a common installation program for easier manipulation of apps based upon a standard X format. That all desktops could use for the installation of their programs. OR about working on a common interface that allowed experienced users the full power of the UNIX api, and could introduce new users to an easy to use OS. IS there any reason why this can't be done given the abilities of the Open Source community in reference to Gnome/KDE? And if you want to know why I wrote to this mailing list it's because YOU are the maintainers of the SYSTEM upon which our standard interface will be run. _________________________________________________________________ It's fast, it's easy and it's free. Get MSN Messenger 7.0 today! http://messenger.msn.co.uk From owner-freebsd-arch@FreeBSD.ORG Sun Jun 19 01:53:08 2005 Return-Path: X-Original-To: freebsd-arch@freebsd.org Delivered-To: freebsd-arch@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 3166116A41C for ; Sun, 19 Jun 2005 01:53:08 +0000 (GMT) (envelope-from ryans@gamersimpact.com) Received: from mailserv1.neuroflux.com (ns2.neuroflux.com [204.228.228.85]) by mx1.FreeBSD.org (Postfix) with ESMTP id DF96D43D4C for ; Sun, 19 Jun 2005 01:53:07 +0000 (GMT) (envelope-from ryans@gamersimpact.com) Received: (qmail 19079 invoked by uid 1003); 19 Jun 2005 01:55:36 -0000 Received: from ryans@gamersimpact.com by mailserv1.neuroflux.com by uid 89 with qmail-scanner-1.22 (clamscan: 0.65. spamassassin: 2.60. Clear:RC:1(63.229.220.75):. Processed in 1.221617 secs); 19 Jun 2005 01:55:36 -0000 Received: from unknown (HELO ?192.168.0.5?) (63.229.220.75) by mailserv1.neuroflux.com with SMTP; 19 Jun 2005 01:55:35 -0000 Message-ID: <42B4D00F.1060907@gamersimpact.com> Date: Sat, 18 Jun 2005 20:53:19 -0500 From: Ryan Sommers User-Agent: Mozilla Thunderbird 1.0.2 (Windows/20050317) X-Accept-Language: en-us, en MIME-Version: 1.0 To: DANIEL hoggan References: In-Reply-To: Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Cc: freebsd-arch@freebsd.org Subject: Re: Standard GUI for UNIX at the system level X-BeenThere: freebsd-arch@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Discussion related to FreeBSD architecture List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 19 Jun 2005 01:53:08 -0000 DANIEL hoggan wrote: > > Is there any reason as to why X cannot be rewrote to be the standard > interface to UNIX? Look at the KGI (Kernel Graphics Interface) project http://kgi-wip.sourceforge.net/ Although they aren't looking to make X the standard interface it's something around what you're thinking about. However, there is a very good reason WHY the standard interface is still the console, the fact that most UNIX computers are probably still being used for servers rather than workstations. Adding a GUI to a server is a pointless consumption of resources in most cases. -- Ryan Sommers ryans@gamersimpact.com From owner-freebsd-arch@FreeBSD.ORG Sun Jun 19 12:42:11 2005 Return-Path: X-Original-To: freebsd-arch@freebsd.org Delivered-To: freebsd-arch@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 6959016A41C for ; Sun, 19 Jun 2005 12:42:11 +0000 (GMT) (envelope-from danny280279@hotmail.com) Received: from hotmail.com (bay104-f18.bay104.hotmail.com [65.54.175.28]) by mx1.FreeBSD.org (Postfix) with ESMTP id 3BBDF43D48 for ; Sun, 19 Jun 2005 12:42:11 +0000 (GMT) (envelope-from danny280279@hotmail.com) Received: from mail pickup service by hotmail.com with Microsoft SMTPSVC; Sun, 19 Jun 2005 05:42:11 -0700 Message-ID: Received: from 65.54.175.202 by by104fd.bay104.hotmail.msn.com with HTTP; Sun, 19 Jun 2005 12:42:10 GMT X-Originating-IP: [65.54.175.202] X-Originating-Email: [danny280279@hotmail.com] X-Sender: danny280279@hotmail.com In-Reply-To: From: "DANIEL hoggan" To: freebsd-arch@freebsd.org Date: Sun, 19 Jun 2005 12:42:10 +0000 Mime-Version: 1.0 Content-Type: text/plain; format=flowed X-OriginalArrivalTime: 19 Jun 2005 12:42:11.0025 (UTC) FILETIME=[4FC2E410:01C574CC] Subject: RE: Request to mailing list freebsd-arch rejected-gui for unix X-BeenThere: freebsd-arch@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Discussion related to FreeBSD architecture List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 19 Jun 2005 12:42:11 -0000 >From: owner-freebsd-arch@freebsd.org >To: danny280279@hotmail.com >Subject: Request to mailing list freebsd-arch rejected >Date: Sun, 19 Jun 2005 11:40:38 +0000 > >Your request to the freebsd-arch mailing list > > Posting of your message titled "Hot plugging systems" > >has been rejected by the list moderator. The moderator gave the >following reason for rejecting your request: > >"Quite aside for the tone of your post, which comes across in a way >that is very unlikely to encourage the volunteers who write the code >to have any desire to cooperate with you, your message came out to >about 3.3 MB; the upper limit on messages for nearly all FreeBSD.org >mailing lists is 200 KB. There is no need to "attach" additional >material to your message -- merely provide a URL, and allow those who >are sufficiently interested in what you have to say to go look. > >But in order for that strategy to be effective, you will need to craft >your message appropriately; it would be ideal if you were to be able >to show a body of code that you had either created or sponsored: it >need nbe complete, but ot generally, there is a very strong perception >that code speak a lot louder than words. > > -- postmaster@freebsd.org" Here is my code: /**************************************************************************** This file is brought to you by the gpl and is available as part of the gge2d graphics engine, This code is unfinished and is only partly complete, this file is to be the complete header file for the graphical component for the gge if you have the time maby you coluld puruse this file and tell me of any problems, bugs or comments you may have. ###END### *****************************************************************************/ #define LOCAL_PICTURES #include "system.h" #include #include #include /*I can't decide whether to put Glitz or Mesa here*/ #include #include /*I don't actually want the server to connect to the hardware, so I need to use an abstraction layer, between the hardware and the server, There's only a couple of changes to the kgi code 1 to add the IO graphics interface, and another to add the mach.h file, so it's connected to the os.*/ /* gge - A 2d graphics engine based upon cairo Copyright (C) 2005 danny This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #include #include */ #include #include #include "system.h" #include "gge-opt.h" char *xmalloc (); char *xrealloc (); char *xstrdup (); int main (int argc, char **argv) { { int arg_ct = optionProcess( &ggeOptions, argc, argv ); argc -= arg_ct; /* if ((argc < ARGC_MIN) || (argc > ARGC_MAX)) { fprintf( stderr, "%s ERROR: remaining args (%d) " "out of range\n", ggeOptions.pzProgName, argc ); USAGE( EXIT_FAILURE ); } */ argv += arg_ct; } /* if (HAVE_OPT(OPT_NAME)) respond_to_opt_name(); */ /* do the work */ return EXIT_SUCCESS; } /***************************************************************************** This source code is made available to you under the terms of the GPL. This Package should be accompanied by a file that contains the associated licensing terms. If you are unable to find this file, please refer to its location on the Internet at www.gnu.org/licenses.html. It was developed from the Rocklyte Systems Pandora engine. ****************************************************************************** ###DESCRIPTION### (from the rocklyte page)

The Action class allows you to execute actions and methods on other objects in the system. It is specifically designed for use in scripts, such as the Dynamic Markup Language. The Action class is especially useful for executing generic actions such as Free, Show, MoveToFront and Resize during the execution of a script. You may also create static Action objects, which are useful for reacting to the user's activity and other events in the system. Another useful feature is action monitoring, which allows you to react to action calls made on any object.

*******************************************************************************/ #include #include static ERROR CMDInit(OBJECTPTR, struct KernelBase *); static ERROR CMDExpunge(void); #define VER_ACTION 1.1 EXPORT struct ModHeader ModHeader = { MODULE_HEADER_V1, CMDInit, NULL, NULL, CMDExpunge, JMP_DEFAULT, 0, CPU_PC, VER_ACTION, VER_KERNEL, }; static struct KernelBase *KernelBase = 0; static struct StringsBase *StringsBase = 0; static struct ActionTable *ActionTable = 0; static OBJECTPTR modStrings = 0; static OBJECTPTR ActionClass = 0; static OBJECTID glBroadcastID = 0; /***************************************************************************** ** Class definition. */ #define LEN_CALL 40 #define LEN_OBJECTREFERENCE 100 #define SIZE_ARGS 100 #define MAX_FIELDS 16 enum { TYPE_ACTION=1, TYPE_METHOD }; struct Action { OBJECT_HEADER /* Class header */ LONG Static; /* Set to TRUE if the action object should remain in memory */ ERROR Error; /* Reflects the error condition of the last executed action */ LONG Flags; /* Optional flags */ PRIVATE_FIELDS OBJECTID ObjectID; OBJECTID ClassID; /* The class of the object in the ObjectID field */ ACTIONID ActionID; /* The related action or method ID */ BYTE ObjectReference[LEN_OBJECTREFERENCE]; BYTE Call[LEN_CALL]; /* The action or method to call */ BYTE Arguments[SIZE_ARGS]; WORD Type; /* Either TYPE_METHOD or TYPE_ACTION */ WORD ArgsSize; WORD Monitor; STRING Fields[MAX_FIELDS+1]; UBYTE ArgsSet; /* Count of arguments that have been set */ }; static ERROR GET_Call(struct Action *, STRING *); static ERROR GET_Custom(struct Action *, STRING *); static ERROR GET_Monitor(struct Action *, OBJECTID *); static ERROR GET_Object(struct Action *, struct Variable *); static ERROR SET_Call(struct Action *, STRING); static ERROR SET_Custom(struct Action *, STRING); static ERROR SET_Method(struct Action *, STRING); static ERROR SET_Monitor(struct Action *, OBJECTID *); static ERROR SET_Object(struct Action *, struct Variable *); #define AF_TRANSLATE 0x00000001 #define AF_LOCAL 0x00000002 #define AF_MESSAGE 0x00000004 #define AF_ACCEPTERRORS 0x00000008 #define AF_NOMSG AF_LOCAL struct FieldDef ActionFlags[] = { { "TRANSLATE", AF_TRANSLATE }, { "LOCAL", AF_LOCAL }, { "MESSAGE", AF_MESSAGE }, { "ACCEPTERRORS", AF_ACCEPTERRORS}, /*** Synonyms ***/ { "NOMSG", AF_NOMSG }, { NULL, NULL } }; static struct FieldArray ActionFields[] = { { "Static", 0, FDF_LONG|FDF_RW, 0, NULL, NULL }, { "Error", 0, FDF_LONG|FDF_R, 0, NULL, NULL }, { "Flags", 0, FDF_LONGFLAGS|FDF_RI, (LONG)&ActionFlags, NULL, NULL }, /*** Virtual fields ***/ { "Monitor", 0, FDF_OBJECTID|FDF_RW, 0, GET_Monitor, SET_Monitor }, { "Call", 0, FDF_STRING|FDF_RW, 0, GET_Call, SET_Call }, { "Custom", 0, FDF_STRING|FDF_RW, 0, GET_Custom, SET_Custom }, { "Method", 0, FDF_STRING|FDF_RW, 0, GET_Call, SET_Method }, { "Object", 0, FDF_VARIABLE|FDF_STRING|FDF_RW, 0, GET_Object, SET_Object }, END_FIELD }; static ERROR ACTION_ActionNotify(struct Action *, struct acActionNotify *); static ERROR ACTION_Activate(struct Action *, APTR); static ERROR ACTION_ClosingTag(struct Action *, APTR); static ERROR ACTION_EventMessage(struct Action *, struct acEventMessage *); static ERROR ACTION_Free(struct Action *, APTR); static ERROR ACTION_GetUnlistedField(struct Action *, struct acGetUnlistedField *); static ERROR ACTION_Init(struct Action *, APTR); static ERROR ACTION_NewObject(struct Action *, APTR); static ERROR ACTION_SetUnlistedField(struct Action *, struct acSetUnlistedField *); static struct ActionArray ActionActions[] = { { AC_ActionNotify, ACTION_ActionNotify }, { AC_Activate, ACTION_Activate }, { AC_ClosingTag, ACTION_ClosingTag }, { AC_EventMessage, ACTION_EventMessage }, { AC_Free, ACTION_Free }, { AC_GetUnlistedField, ACTION_GetUnlistedField }, { AC_Init, ACTION_Init }, { AC_NewObject, ACTION_NewObject }, { AC_SetUnlistedField, ACTION_SetUnlistedField }, { NULL, NULL } }; static ERROR SetArgument(struct Action *Self, STRING Field, STRING Value); /***************************************************************************** ** User Instructions. */ static BYTE ActionUsage[] = { "USAGE: action object=name|id [call|method]=action [args...]\n\ \n\ You can call any action or method on an object by using this\n\ command. This command is considered to be very powerful, so we\n\ recommend that you read the Action List manual in the Documents\n\ Folder before you use it.\n\ \n\ Examples\n\ --------\n\ If you wanted to destroy an object that you knew the ID of,\n\ you could use this command:\n\ \n\ action object=-5329 call=free\n\ \n\ If you wanted to move a particular window to the front of the\n\ display:\n\ \n\ action object=mywindow call=movetofront\n" }; /***************************************************************************** ** Command: Init() */ static ERROR CMDInit(OBJECTPTR argModule, struct KernelBase *argKernelBase) { KernelBase = argKernelBase; if (CreateObject(ID_MODULE, NULL, &modStrings, NULL, FID_Name|TSTRING, "strings", FID_Version|TFLOAT, MODVERSION_STRINGS, TAGEND) IS ERR_Okay) { if (GetField(modStrings, FID_ModBase, FT_POINTER, &StringsBase) != ERR_Okay) { return(ObjectError(argModule, ERH_InitModule, ERR_GetField)); } } else return(ObjectError(argModule, ERH_InitModule, ERR_CreateObject)); /*** Get the global action table from the kernel ***/ if (!(ActionTable = ActionList())) { return(ObjectError(argModule, ERH_InitModule, ERR_Failed)); } /*** Find the SystemBroadcaster ***/ FastFindObject("SystemBroadcaster", ID_BROADCAST, &glBroadcastID, 1, NULL); return(CreateObject(ID_CLASS, NULL, (OBJECTPTR *)&ActionClass, NULL, FID_BaseClassID|TLONG, ID_ACTION, FID_Version|TFLOAT, VER_ACTION, FID_Name|TSTRING, "Action", FID_Category|TLONG, CCF_COMMAND, FID_Usage|TPTR, ActionUsage, FID_Actions|TPTR, ActionActions, FID_Fields|TPTR, ActionFields, FID_Size|TLONG, sizeof(struct Action), TAGEND)); } /***************************************************************************** ** Command: Expunge() */ static ERROR CMDExpunge(void) { if (modStrings) { acFree(modStrings); modStrings = NULL; } if (ActionClass) { acFree(ActionClass); ActionClass = NULL; } return(ERR_Okay); } /***************************************************************************** ** Internal: ActivateObject() ** ** We use Action() only if we are operating on a private object or if AF_LOCAL ** is specified. Note that ActionMsg() returns ERR_Okay even if the action ** itself fails, so the use of AF_LOCAL is useful when you need the error code. */ static ERROR ActivateObject(struct Action *Self, ACTIONID ActionID, OBJECTID ObjectID) { OBJECTPTR object; ERROR error; if ((ObjectID > 0) OR (Self->Flags & AF_LOCAL)) { if ((error = AccessObject(ObjectID, 5000, &object)) IS ERR_Okay) { if (Self->ArgsSize) error = Action(ActionID, object, Self->Arguments); else error = Action(ActionID, object, NULL); ReleaseObject(object); } else { DPrintF("@Action:","AccessObject(%d) returned error %d.", ObjectID, error); error = ERR_AccessObject; } } else { if (Self->Flags & AF_MESSAGE) { if ((Self->ArgsSize) AND (Self->ArgsSet)) error = DelayMsg(ActionID, ObjectID, Self->Arguments); else error = DelayMsg(ActionID, Self->ObjectID, NULL); } else { if ((Self->ArgsSize) AND (Self->ArgsSet)) error = ActionMsg(ActionID, ObjectID, Self->Arguments); else error = ActionMsg(ActionID, ObjectID, NULL); } } return(error); } /***************************************************************************** ** Action: ActionNotify */ static ERROR ACTION_ActionNotify(struct Action *Self, struct acActionNotify *Args) { LONG i, count; if (Self->ActionID IS Args->ActionID) { /* Action Monitoring ** ----------------- ** If we are waiting on a custom call, make sure that the custom string ** matches what we are expecting. NB: This only works when monitoring ** custom actions reported from the same task space, because pointers ** reported via ActionNotify are always invalid when sent between tasks. */ Self->Error = Args->Error; if (Args->Error != ERR_Okay) { if (!(Self->Flags & AF_ACCEPTERRORS)) return(ERR_Okay); } if (Self->ActionID IS AC_Custom) { struct acCustom *custom; custom = (struct acCustom *)Args->Args; if (!custom) return(ObjectError(Self, ERH_ActionNotify, ERR_Args)); if (StrCompare(custom->String, ((struct acCustom *)Self->Arguments)->String, 0, STR_MATCHLENGTH) != ERR_Okay) { //DPrintF("Action:","Received custom call, but string '%s' != '%s'", custom->String, ((struct acCustom *)Self->Arguments)->String); return(ERR_Okay); } } /*** Activate the children ***/ if ((count = TotalChildren(Self->Head.UniqueID)) > 0) { struct ChildEntry list[count]; if (ListChildren(GetUniqueID(Self), list, &count) IS ERR_Okay) { for (i=0; i < count; i++) { ActivateObject(Self, AC_Activate, list[i].ObjectID); //ActionMsg(AC_Activate, list[i].ObjectID, NULL); } } } else DPrintF("ActionNotify:","[Action:%d] I have no child objects that need to be activated.", Self->Head.UniqueID); } return(ERR_Okay); } /***************************************************************************** ** Action: Activate */ static ERROR ACTION_Activate(struct Action *Self, APTR Void) { STRING fieldvalue; WORD i; BYTE str[1024], tmp[1024]; if (Self->ActionID IS AC_Custom) { DPrintF("~Activate()","[Action:%d] Custom: %s, Object: %d", Self->Head.UniqueID, ((struct acCustom *)Self->Arguments)->String, Self->ObjectID); } else DPrintF("~Activate()","[Action:%d] Call: %s, Object: %d", Self->Head.UniqueID, Self->Call, Self->ObjectID); if (Self->ObjectReference[0]) { if (StrCopy(Self->ObjectReference, str, sizeof(str)) < sizeof(str)) { if (StrTranslate(str, sizeof(str), NULL) IS ERR_Okay) Self->ObjectID = (OBJECTID)StrToInt(str); else Self->ObjectID = (OBJECTID)StrToInt(Self->ObjectReference); } else return((Self->Error = StepObjectError(Self, ERH_Activate, ERR_BufferOverflow))); } if (!Self->ActionID) { DPrintF("@Activate:","[Action] Action field not set."); StepBack(); return(Self->Error = ERR_FieldNotSet); } if (!Self->ObjectID) { DPrintF("@Activate:","[Action] Object field not set."); StepBack(); return(Self->Error = ERR_FieldNotSet); } if (Self->Flags & AF_TRANSLATE) { for (i=0; Self->Fields[i]; i++) { for (fieldvalue=Self->Fields[i]; *fieldvalue; fieldvalue++); fieldvalue++; StrCopy(fieldvalue, str, sizeof(str)); StrTranslate(str, sizeof(str), NULL); if ((*str IS '=') AND (StrCalculate(str+1, NULL, tmp, sizeof(tmp)) IS ERR_Okay)) { SetArgument(Self, Self->Fields[i], tmp); } else SetArgument(Self, Self->Fields[i], str); } } /*** Activate the target object here ***/ Self->Error = ActivateObject(Self, Self->ActionID, Self->ObjectID); if (Self->Error) ObjectError(Self, ERH_Activate, Self->Error); StepBack(); return(Self->Error); } /***************************************************************************** ** Action: ClosingTag */ static ERROR ACTION_ClosingTag(struct Action *Self, APTR Void) { if (Self->Monitor) return(ERR_Okay); if (Self->Static IS FALSE) { /*** Unless we are static, Activate and then Free ourselves ***/ acActivate(Self); acFree(Self); } return(ERR_Okay); } /***************************************************************************** ** Action: EventMessage */ static ERROR ACTION_EventMessage(struct Action *Self, struct acEventMessage *Args) { LONG count; WORD i; if ((Args->EventID IS EVT_TaskCrashed) AND (Self->ActionID IS AC_Free)) { DPrintF("EventMessage()","[Action:%d] Task crash detected.", Self->Head.UniqueID); if (CheckObjectExists(Self->ObjectID, NULL) != ERR_Okay) { if ((count = TotalChildren(Self->Head.UniqueID)) > 0) { struct ChildEntry list[count]; if (ListChildren(GetUniqueID(Self), list, &count) IS ERR_Okay) { for (i=0; i < count; i++) { ActionMsg(AC_Activate, list[i].ObjectID, NULL); } } } else DPrintF("ActionNotify:","[Action:%d] I have no child objects that need to be activated.", Self->Head.UniqueID); } } return(ERR_Okay); } /***************************************************************************** ** Action: Free */ static ERROR ACTION_Free(struct Action *Self, APTR Void) { struct MemInfo info; struct FunctionField *function; struct MethodArray *methods; OBJECTPTR class, broadcast; LONG offset; APTR memory; WORD i; if ((Self->Monitor) AND (Self->ActionID IS AC_Free)) { if (AccessObject(glBroadcastID, 5000, &broadcast) IS ERR_Okay) { ActionTags(MT_UnsubscribeEvent, broadcast, Self->Head.UniqueID, EVT_TaskCrashed); ReleaseObject(broadcast); } } for (i=0; Self->Fields[i]; i++) { FreeMemory(Self->Fields[i]); Self->Fields[i] = NULL; } if (Self->ArgsSize) { /*** If any strings were allocated in the argument structure, we must free them ***/ if (Self->ActionID) { function = NULL; if (Self->ActionID < 0) { if (Self->ClassID) { if ((class = FindClass(Self->ClassID, NULL))) { if ((GetField(class, FID_Methods, FT_POINTER, &methods) IS ERR_Okay) AND (methods)) { function = methods[-Self->ActionID].Args; } } } } else function = ActionTable[Self->ActionID].Args; if (function) { offset = 0; while (function->Name) { if (function->Type & ARG_STRING) { if ((memory = ((STRING *)(Self->Arguments+offset))[0])) { if (MemoryPtrInfo(memory, VER_MemoryInfo, &info) IS ERR_Okay) { ReleaseMemory(memory); FreeMemoryID(info.MemoryID); } } } if (function->Type & ARG_LONG) offset += sizeof(LONG); else if (function->Type & ARG_LARGE) offset += sizeof(LARGE); else if (function->Type & (ARG_PTR|ARG_STRING)) offset += sizeof(APTR); else if (function->Type & ARG_DOUBLE) offset += sizeof(DOUBLE); function++; } } } } return(ERR_Okay); } /***************************************************************************** ###ACTION### Name: GetUnlistedField Short: This action is supported for retrieving unlisted field values. ###END### *****************************************************************************/ static ERROR ACTION_GetUnlistedField(struct Action *Self, struct acGetUnlistedField *Args) { STRING fieldvalue; LONG i, j; for (i=0; Self->Fields[i]; i++) { if (StrCompare(Args->Field, Self->Fields[i], NULL, STR_MATCHLENGTH) IS ERR_Okay) { for (fieldvalue=Self->Fields[i]; *fieldvalue; fieldvalue++); fieldvalue++; for (j=0; (fieldvalue[j]) AND (j < Args->Size-1); j++) Args->Buffer[j] = fieldvalue[j]; Args->Buffer[j++] = 0; if (j >= Args->Size) return(ERR_BufferOverflow); else return(ERR_Okay); } } DPrintF("@GetVariable:","[Set] The variable \"%s\" does not exist.", Args->Field); return(ERR_Okay); } /***************************************************************************** ** Action: Init */ static ERROR ACTION_Init(struct Action *Self, APTR Void) { OBJECTPTR monitor, broadcast; if (!Self->ObjectID) Self->ObjectID = Self->Head.OwnerID; if (!Self->ActionID) { if ((Self->Type IS TYPE_METHOD) AND (Self->ObjectID)) { SetField(Self, FID_Method, FT_STRING, Self->Call); if (!Self->ActionID) { DPrintF("@Init:","[Action] Unable to resolve method \"%s\" for object %d", Self->Call, Self->ObjectID); return(ERR_FieldNotSet); } } else { if ((!Self->ActionID) AND (!Self->ObjectID)) DPrintF("@Init:","[Action:%d] Missing both the action and object fields.", Self->Head.UniqueID); else if (Self->ActionID) DPrintF("@Init:","[Action:%d] Missing the object field (call %s).", Self->Head.UniqueID, Self->Call); else DPrintF("@Init:","[Action:%d] Missing the action field (object #%d).", Self->Head.UniqueID, Self->ObjectID); return(ERR_FieldNotSet); } } /* If action monitoring is to be used, subscribe ** to the action here. */ if (Self->Monitor) { if (AccessObject(Self->ObjectID, 5000, &monitor) IS ERR_Okay) { SubscribeAction(monitor, Self->ActionID, Self); ReleaseObject(monitor); } /* When the Free action is being monitored, subscribed to the TaskCrashed ** event so that we know if the monitored object is ever destroyed by a ** crash. */ if (Self->ActionID IS AC_Free) { if (AccessObject(glBroadcastID, 5000, &broadcast) IS ERR_Okay) { ActionTags(MT_SubscribeEvent, broadcast, Self->Head.UniqueID, EVT_TaskCrashed); ReleaseObject(broadcast); } } } Self->Error = ERR_Failed; return(ERR_Okay); } /***************************************************************************** ** Action: SetUnlistedField */ static ERROR ACTION_SetUnlistedField(struct Action *Self, struct acSetUnlistedField *Args) { STRING fieldname; LONG len; WORD i; if ((!Args) OR (!Args->Field) OR (!Args->Value)) { return(ObjectError(Self, ERH_SetUnlistedField, ERR_Args)); } if (Self->Flags & AF_TRANSLATE) { /* If translation mode is enabled, store the argument name and value for ** future translation. */ for (i=0; Self->Fields[i]; i++) { if (StrCompare(Args->Field, Self->Fields[i], NULL, STR_MATCHLENGTH) IS ERR_Okay) { FreeMemory(Self->Fields[i]); Self->Fields[i] = NULL; break; } } if (i < MAX_FIELDS) { if (AllocMemory(StrLength(Args->Field) + StrLength(Args->Value) + 2, MEM_STRING|MEM_NOCLEAR, (void **)&fieldname, NULL) IS ERR_Okay) { Self->Fields[i] = fieldname; if (Args->Field[0] IS '?') i = StrCopy(Args->Field+1, fieldname, COPY_ALL) + 1; else i = StrCopy(Args->Field, fieldname, COPY_ALL) + 1; StrCopy(Args->Value, fieldname + i, COPY_ALL); if (fieldname[i] IS '<') { len = StrLength(fieldname+i); if (fieldname[i+len-1] IS '>') { fieldname[i] = '['; fieldname[i+len-1] = ']'; } } } } else return(ERR_Failed); return(ERR_Okay); } if (!Self->ActionID) { /*** Resolve the action/method ID if we have not been able to do so already ***/ if (!Self->ObjectID) { Self->ObjectID = Self->Head.OwnerID; Self->ClassID = GetClassID(Self->ObjectID); Self->ObjectReference[0] = 0; } if (Self->Type IS TYPE_METHOD) { if (Self->ObjectID) { SetField(Self, FID_Method, FT_POINTER, Self->Call); } else { DPrintF("@SetField()","[Action] You need to set an object before setting field \"%s\".", Args->Field); return(ERR_FieldNotSet); } } if (!Self->ActionID) { DPrintF("@SetUnlistedField()","[Action] You need to give me an action or method before setting field \"%s\".", Args->Field); return(ERR_FieldNotSet); } } else if (!Self->ArgsSize) { DPrintF("@SetUnlistedField()","[Action] The %s action does not support arguments (%s).", Self->Call, Args->Field); return(ERR_FieldNotSet); } SetArgument(Self, Args->Field, Args->Value); return(ERR_Okay); } static ERROR SetArgument(struct Action *Self, STRING Field, STRING Value) { struct FunctionField *field; struct MethodArray *methods; OBJECTPTR class; OBJECTID ObjectID; STRING string; LONG offset, size, len; field = NULL; size = NULL; if (Self->ActionID < 0) { /*** Method argument handling (requires that we lookup the class) ***/ if ((!Self->ObjectID) OR (!Self->ClassID)) { DPrintF("!SetUnlistedField()","[Action:%d] You need to set the Object field before defining arguments.", Self->Head.UniqueID); return(ERR_FieldNotSet); } if ((class = FindClass(Self->ClassID, NULL))) { if ((GetField(class, FID_Methods, FT_POINTER, &methods) IS ERR_Okay) AND (methods)) { field = methods[-Self->ActionID].Args; size = methods[-Self->ActionID].StructureSize; } else return(ObjectError(Self, ERH_SetUnlistedField, ERR_NoMethods)); } else return(ObjectError(Self, ERH_SetUnlistedField, ERR_MissingClass)); } else { /*** Action argument handling ***/ field = ActionTable[Self->ActionID].Args; size = ActionTable[Self->ActionID].Size; } /*** Find the argument and set it ***/ offset = 0; while (field->Name) { if (StrCompare(field->Name, Field, NULL, STR_MATCHLENGTH) IS ERR_Okay) { if (field->Type & ARG_LONG) { if (field->Type & ARG_OBJECT) { if (FastFindObject(Value, NULL, &ObjectID, 1, NULL) IS ERR_Okay) { ((LONG *)(Self->Arguments+offset))[0] = ObjectID; } } else ((LONG *)(Self->Arguments+offset))[0] = (LONG)StrToInt(Value); } else if (field->Type & ARG_LARGE) ((LARGE *)(Self->Arguments+offset))[0] = StrToInt(Value); else if (field->Type & ARG_STRING) { /*** Free any existing string setting first ***/ if ((string = ((STRING *)(Self->Arguments+offset))[0])) { FreeMemory(string); ((STRING *)(Self->Arguments+offset))[0] = NULL; } for (len=0; Value[len]; len++); if (AllocMemory(len+1, MEM_STRING, (void **)&string, NULL) IS ERR_Okay) { for (len=0; Value[len]; len++) string[len] = Value[len]; string[len] = 0; ((STRING *)(Self->Arguments+offset))[0] = string; } } else if (field->Type & ARG_PTR) ((APTR *)(Self->Arguments+offset))[0] = (APTR)(LONG)StrToInt(Value); else if (field->Type & ARG_DOUBLE) ((DOUBLE *)(Self->Arguments+offset))[0] = StrToFloat(Value); else DPrintF("@SetUnlistedField:","[Action] Unknown argument definition %s / %d.", Self->Call, field->Type); break; } if (field->Type & ARG_LONG) offset += sizeof(LONG); else if (field->Type & ARG_LARGE) offset += sizeof(LARGE); else if (field->Type & ARG_PTR) offset += sizeof(APTR); else if (field->Type & ARG_STRING) offset += sizeof(STRING); else if (field->Type & ARG_DOUBLE) offset += sizeof(DOUBLE); else DPrintF("@SetUnlistedField:","[Action] Bad argument definition found for action \"%s\", argument \"%s\"", Self->Call, field->Name); field++; if (offset >= size) break; } /*** If we got to the end of the list, then the argument does not exist ***/ if (!field->Name) DPrintF("@SetUnlistedField:","[Action] Unknown argument \"%s\" for action \"%s\".", Field, Self->Call); else Self->ArgsSet = TRUE; return(ERR_Okay); } /***************************************************************************** ** Action: NewObject */ static ERROR ACTION_NewObject(struct Action *Self, APTR Void) { Self->Static = FALSE; return(ERR_Okay); } /***************************************************************************** ###FIELD### Name: Call Short: Set this field to specify the action that you want to call. Type: STRING Status: Read/Write ###DESCRIPTION###

This field (or the method field) must be set to determine the action that will be executed or monitored by an action object. A list of valid action names are provided in the manual describing the available system actions.

###NOTE###

It is vital that the correct arguments are provided with the action that you are going to call - failure to set the arguments can give unpredictable results.

###SEE ALSO### Field: Method ###END### *****************************************************************************/ static ERROR GET_Call(struct Action *Self, STRING *Value) { *Value = Self->Call; return(ERR_Okay); } static ERROR SET_Call(struct Action *Self, STRING Value) { struct MethodArray *MethodTable; OBJECTPTR class; LONG totalmethods; WORD i; Self->ActionID = NULL; if ((!Value) OR (!*Value)) { Self->Call[0] = 0; return(ERR_Okay); } for (i=0; (Value[i]) AND (i < LEN_CALL-1); i++) Self->Call[i] = Value[i]; Self->Call[i] = 0; for (i=1; ActionTable[i].Name; i++) { if (StrCompare(ActionTable[i].Name, Self->Call, NULL, STR_MATCHLENGTH) IS ERR_Okay) { Self->ArgsSize = ActionTable[i].Size; Self->ActionID = i; Self->Type = TYPE_ACTION; return(ERR_Okay); } } /*** Test if the reference is to a method (only possible if we know the target object) ***/ if ((Self->ObjectID) AND (Self->ClassID)) { if ((class = FindClass(Self->ClassID, NULL))) { if ((GetFields(class, FID_Methods|TPTR, &MethodTable, FID_TotalMethods|TLONG, &totalmethods, TAGEND) IS ERR_Okay) AND (MethodTable)) { for (i=1; i < totalmethods+1; i++) { if (StrCompare(Value, MethodTable[i].Name, NULL, STR_MATCHLENGTH) IS ERR_Okay) { Self->ArgsSize = MethodTable[i].StructureSize; Self->ActionID = MethodTable[i].MethodID; Self->Type = TYPE_METHOD; return(ERR_Okay); } } } } } /* Consider the setting to be to a customised action if it is not ** a valid action or method. */ DPrintF("Set.Call:","[Action:%d] Action \"%s\" not recognised - assuming customised.", Self->Head.UniqueID, Self->Call); SET_Custom(Self, Value); return(ERR_Search); } /****************************************************************************** ###FIELD### Name: Custom Short: The Custom field provides a customised action service. Type: STRING ###DESCRIPTION###

The Custom field is used in circumstances where you want to execute a custom action on an object, or to create a customised action for an existing object. When setting the Custom field, you need to provide a unique name that does not match any of the existing action names (it is recommended that you steer clear of using generic terms such as 'Refresh'). If you set the Custom field, you must not set it in conjunction with the Method or Call fields, or you will lose your definition. Also, you may not pass your own arguments via custom actions, although you may set the 'Number' argument that accompanies the customised action standard.

###END### ******************************************************************************/ static ERROR GET_Custom(struct Action *Self, STRING *Value) { *Value = Self->Call; return(ERR_Okay); } static ERROR SET_Custom(struct Action *Self, STRING Value) { WORD i; if ((!Value) OR (!*Value)) return(ERR_NoData); for (i=0; "Custom"[i]; i++) Self->Call[i] = "Custom"[i]; Self->Call[i] = 0; ((struct acCustom *)(Self->Arguments))->Number = 0; ((struct acCustom *)(Self->Arguments))->String = StrClone(Value); Self->ArgsSize = sizeof(struct acCustom); Self->ArgsSet = TRUE; Self->ActionID = AC_Custom; Self->Type = TYPE_ACTION; return(ERR_Okay); } /***************************************************************************** ###FIELD### Name: Error Short: Reflects the error code of the last executed action. Type: LONG Status: Read Version: 1.1 ###DESCRIPTION###

When an Action object is activated, the Error field will be updated to reflect the error code that was returned from that action or method. A string describing the error code can be loaded from the 'system:config/error_messages.cfg' config file.

###END### *****************************************************************************/ /***************************************************************************** ###FIELD### Name: Method Short: Set if you want to execute a method rather than an action. Type: STRING Status: Write ###DESCRIPTION###

If a method should be executed rather than an action, set this field to the name of the method that you want to execute. If the method requires that a certain number of arguments need to be set, you must also set those arguments via the unlisted field mechanism, to ensure that the method call is legal.

###SEE ALSO### Field: Call ###END### *****************************************************************************/ static ERROR SET_Method(struct Action *Self, STRING Method) { struct MethodArray *MethodTable; OBJECTPTR class; LONG i, TotalMethods; if (!Method) { Self->Call[0] = 0; return(ERR_Okay); } for (i=0; (Method[i]) AND (i < sizeof(Self->Call)); i++) Self->Call[i] = Method[i]; Self->Call[i] = 0; if (!Self->ObjectID) { Self->Type = TYPE_METHOD; return(ERR_Okay); } if (Self->ClassID) { if ((class = FindClass(Self->ClassID, NULL))) { if ((GetFields(class, FID_Methods|TPTR, &MethodTable, FID_TotalMethods|TLONG, &TotalMethods, TAGEND) IS ERR_Okay) AND (MethodTable)) { for (i=1; i < TotalMethods+1; i++) { if (StrCompare(Method, MethodTable[i].Name, NULL, STR_MATCHLENGTH) IS ERR_Okay) { Self->ArgsSize = MethodTable[i].StructureSize; Self->ActionID = MethodTable[i].MethodID; Self->Type = TYPE_METHOD; return(ERR_Okay); } } DPrintF("@Set.Method:","[Action] Could not find method \"%s\" from %d methods in class %d.", Method, TotalMethods, Self->ClassID); return(ERR_Search); } else { DPrintF("@Set.Method:","[Action] Object #%d does not support any methods (class %d).", Self->ObjectID, Self->ClassID); return(ERR_NoMethods); } } else return(ObjectError(Self, ERH_SetField, ERR_Search)); } else return(ERR_Okay); } /***************************************************************************** ###FIELD### Name: Monitor Short: If you want to monitor an object for activity, set this field. Type: OBJECTID Status: Read/Write ###DESCRIPTION###

By setting the Monitor field to an existing ObjectID, your action object will only react when the monitored object completes a specific action. Because monitoring requires that the action object is static, setting the Monitor field will automatically ensure that the action object is not freed during script execution.

In the following example, action monitoring is used to react to an object when it is freed:

   <action monitor="[myobject]" call="free"/>
      <action static call="hide" object="[{name}]"/>
   </action>

The action is only reported if it succeeds on execution. If you want to enable reporting of failed actions, you need to set the ACCEPTERRORS flag.

###SEE ALSO### Field: Call, Object ###END### *****************************************************************************/ static ERROR GET_Monitor(struct Action *Self, OBJECTID *ObjectID) { *ObjectID = Self->ObjectID; return(ERR_Okay); } static ERROR SET_Monitor(struct Action *Self, OBJECTID *ObjectID) { Self->Monitor = TRUE; Self->Static = TRUE; Self->ObjectID = *ObjectID; Self->ClassID = GetClassID(Self->ObjectID); Self->ObjectReference[0] = 0; return(ERR_Okay); } /***************************************************************************** ###FIELD### Name: Object Short: Refers to the object that will receive the action. Type: STRING/OBJECTID Status: Read/Write ###DESCRIPTION###

The object that is to receive the action call must be specified in this field. You are required to set this field unless you intend to use action monitoring, in which case you should set the Monitor field.

If you set this field with a string, the object reference will be translated to an ID in run-time.

###SEE ALSO### Fields: Call, Monitor ###END### *****************************************************************************/ static ERROR GET_Object(struct Action *Self, struct Variable *Value) { BYTE buffer[200]; if (Value->Type & FD_LARGE) { if (Self->ObjectReference[0]) { if (StrCopy(Self->ObjectReference, buffer, sizeof(buffer)) < sizeof(buffer)) { if (StrTranslate(buffer, sizeof(buffer), NULL) IS ERR_Okay) { Value->Large = StrToInt(buffer); } else Value->Large = StrToInt(Self->ObjectReference); } else return(ObjectError(Self, ERH_SetField, ERR_BufferOverflow)); } else Value->Large = Self->ObjectID; return(ERR_Okay); } else return(ObjectError(Self, ERH_GetField, ERR_FieldTypeMismatch)); } static ERROR SET_Object(struct Action *Self, struct Variable *Value) { BYTE buffer[200]; LONG i; if (Value->Type & FD_LARGE) { Self->ObjectID = (OBJECTID)Value->Large; Self->ClassID = GetClassID(Self->ObjectID); Self->ObjectReference[0] = 0; return(ERR_Okay); } else if (Value->Type & FD_STRING) { if ((!Value->Pointer) OR (!((STRING)Value->Pointer)[0])) return(ERR_Okay); for (i=0; (((STRING)Value->Pointer)[i]) AND (((STRING)Value->Pointer)[i] != '['); i++); if (((STRING)Value->Pointer)[i] IS '[') { if (StrCopy(Value->Pointer, Self->ObjectReference, LEN_OBJECTREFERENCE) < LEN_OBJECTREFERENCE) { if (StrCopy(Self->ObjectReference, buffer, sizeof(buffer)) < sizeof(buffer)) { if (StrTranslate(buffer, sizeof(buffer), NULL) IS ERR_Okay) Self->ObjectID = (OBJECTID)StrToInt(buffer); else Self->ObjectID = (OBJECTID)StrToInt(Self->ObjectReference); Self->ClassID = GetClassID(Self->ObjectID); return(ERR_Okay); } else return(ObjectError(Self, ERH_SetField, ERR_BufferOverflow)); } else return(ObjectError(Self, ERH_SetField, ERR_BufferOverflow)); } else { FastFindObject(Value->Pointer, NULL, &Self->ObjectID, 1, NULL); Self->ClassID = GetClassID(Self->ObjectID); return(ERR_Okay); } } else return(ObjectError(Self, ERH_SetField, ERR_FieldTypeMismatch)); } /***************************************************************************** ###FIELD### Name: Static Short: Set to TRUE if the Action should be static. Type: BOOLEAN Status: Read/Write ###DESCRIPTION###

By default, an Action object will execute itself and then self-destruct when the closing tag is received. If you would rather that the object stays in the system, set this field to TRUE. If you do this, the only way to get the Action object to perform is to call the Activate() action.

###END### *****************************************************************************/ I am basing my engine on the Pandora engine but into this I'm wanting to add the ggi libs, add the x network transparency, and a hotplugging module system that would allow the user to add plugins just by using the installation package. I never began that part but the code would look something like this from edesktop enviroment: // generated by Fast Light User Interface Designer (fluid) version 2,0003 #include "einstaller.h" // Installer for EDE is (C) Copyright 2001-2002 by Martin Pekar, this program is provided under the terms of GNU GPL v.2, see file COPYING for more information. #include #include "einstall.h" #include static Fl_Text_Buffer *out_buffer; static Fl_Window* install_window; #include #include static const char *datas_install[] = { /* columns rows colors chars-per-pixel */ "120 260 224 2", " c Gray0", ". c #0f0f3f3f0f0f", "X c #0f0f37372f2f", "o c #202018180f0f", "O c #20201f1f1f1f", "+ c #2f2f28281010", "@ c #2f2f28281f1f", "# c #3f3f37371f1f", "$ c #2f2f27272020", "% c #2f2f2f2f2f2f", "& c #202037372f2f", "* c #202038383030", "= c #20203f3f3f3f", "- c #30302f2f2f2f", "; c #303037372f2f", ": c #3f3f37372f2f", "> c #3f3f37373030", ", c #000017174040", "< c #00001f1f4040", "1 c #00001f1f4f4f", "2 c #00001f1f5050", "3 c #00001f1f5f5f", "4 c #000000007f7f", "5 c #00001f1f6060", "6 c #00001f1f6f6f", "7 c #00001f1f7f7f", "8 c #000028285f5f", "9 c #0f0f37374040", "0 c #000027276f6f", "q c #000028286060", "w c #000028286f6f", "e c #000027277070", "r c #000028287070", "t c #00002f2f7070", "y c #00003f3f7f7f", "u c #20203f3f5050", "i c #0f0f67670000", "p c #0f0f68681f1f", "a c #2f2f4f4f1010", "s c #3f3f40403030", "d c #2f2f68680000", "f c #2f2f6f6f1010", "g c #0f0f58584f4f", "h c #000050505f5f", "j c #101048484040", "k c #0f0f60605f5f", "l c #000068686060", "z c #0f0f68686060", "x c #000067677070", "c c #000070706060", "v c #000070706f6f", "b c #000070707070", "n c #000078787070", "m c #00007f7f7f7f", "M c #2f2f48484040", "N c #2f2f50504f4f", "B c #2f2f57575f5f", "V c #202060604040", "C c #2f2f68686060", "Z c #303070707070", "A c #4f4f38382020", "S c #404048481010", "D c #4f4f48482020", "F c #4f4f40403030", "G c #4f4f47473f3f", "H c #5f5f47472f2f", "J c #4f4f60601f1f", "K c #707048481f1f", "L c #6f6f68681f1f", "P c #4f4f48484040", "I c #4f4f50504040", "U c #4f4f50504f4f", "Y c #4f4f58584f4f", "T c #5f5f57574f4f", "R c #50505f5f5f5f", "E c #4f4f70707070", "W c #6f6f67674f4f", "Q c #6f6f67675f5f", "! c #6f6f6f6f6f6f", "~ c #707070706060", "^ c #707070706f6f", "/ c #707078786f6f", "( c #707078787070", ") c Gray50", "_ c #00001f1f8f8f", "` c #00000f0fa0a0", "' c #00001717a0a0", "] c #00001717afaf", "[ c #00001f1fafaf", "{ c #000027278080", "} c #000027278f8f", "| c #00002f2f8080", " . c #00002f2f8f8f", ".. c #000027279090", "X. c #00002f2f9090", "o. c #00002f2f9f9f", "O. c #0f0f37379090", "+. c #00002727afaf", "@. c #00002f2fa0a0", "#. c #00002f2fafaf", "$. c #00002f2fb0b0", "%. c #00003737a0a0", "&. c #00003737b0b0", "*. c #00003737bfbf", "=. c #00002f2fd0d0", "-. c #00004f4f9f9f", ";. c #1f1f58589f9f", ":. c #00004040a0a0", ">. c #00004040bfbf", ",. c #00004848bfbf", "<. c #00005858afaf", "1. c #000078788080", "2. c #00004747c0c0", "3. c #00004040cfcf", "4. c #00005050c0c0", "5. c #00005858c0c0", "6. c #00005858cfcf", "7. c #00004848e0e0", "8. c #00005050e0e0", "9. c #00005757ffff", "0. c #00006060cfcf", "q. c #10106060cfcf", "w. c #00006060ffff", "e. c #00006f6ff0f0", "r. c #0f0f6868f0f0", "t. c #1f1f6f6fffff", "y. c #3f3f7070cfcf", "u. c #4f4f68689090", "i. c #0000bfbf0000", "p. c #202088881010", "a. c #1f1f90906060", "s. c #0000a0a04040", "d. c #2f2fc7c72020", "f. c #1f1fd0d04f4f", "g. c #5f5f88881f1f", "h. c #6060a0a01010", "j. c #505090906f6f", "k. c #6060cfcf2020", "l. c #4040dfdf6f6f", "z. c #000080808080", "x. c #0000bfbfbfbf", "c. c #3f3f90909090", "v. c #20208f8fdfdf", "b. c #707090909090", "n. c #70709090afaf", "m. c #50509797c0c0", "M. c #6f6f9f9fcfcf", "N. c #6060f0f0a0a0", "B. c #bfbf00000000", "V. c #a0a038381010", "C. c #90906f6f1f1f", "Z. c #9f9f70704f4f", "A. c #808078786f6f", "S. c #8f8f78786060", "D. c #909088883f3f", "F. c #8f8fb8b81010", "G. c #9090b8b83f3f", "H. c #bfbfbfbf0000", "J. c #8f8f80806f6f", "K. c #808080807070", "L. c #8f8f87877070", "P. c #bfbf98984040", "I. c #afaf88886060", "U. c #afaf98986f6f", "Y. c #c0c0a7a77070", "T. c #c0c0d8d82f2f", "R. c Yellow", "E. c #dfdfdfdf4f4f", "W. c #808087878080", "Q. c #8f8f88888f8f", "!. c #8f8f90908f8f", "~. c #909088888080", "^. c #909090908080", "/. c #9f9f90908f8f", "(. c #9f9f98988f8f", "). c #9f9f98989090", "_. c #9f9f98989f9f", "`. c #80809f9fa0a0", "'. c #8f8fa0a0b0b0", "]. c #a0a098989090", "[. c #a0a0a7a79f9f", "{. c #afafa8a89f9f", "}. c #bfbfafaf9090", "|. c #a0a0a8a8afaf", " X c #afafa8a8a0a0", ".X c #a0a0b7b7afaf", "XX c #b0b0afafa0a0", "oX c #b0b0b0b0afaf", "OX c #bfbfb7b7afaf", "+X c #b0b0b8b8bfbf", "@X c #bfbfb8b8b0b0", "#X c Gray75", "$X c #80809797f0f0", "%X c #8080a7a7cfcf", "&X c #9f9fb7b7c0c0", "*X c #b0b0b8b8cfcf", "=X c #a0a0afaff0f0", "-X c #9090cfcfcfcf", ";X c #9090f0f0efef", ":X c #afafc8c8d0d0", ">X c #b0b0c7c7c0c0", ",X c #a0a0c8c8efef", " j m m m m m m m m m m m m m m m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m m m m Z sX4X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6XuX; ; s s s s s s j m m m m m m m m m m m m m m m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m m m m Z aX5X6X6X5X5X5X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6XuX; ; s s s s s s j m m m m m m m m m m m m m m m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m m m m Z pX5X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6XuX; ; s s s s s s j m m m m m m m m m m m m m m m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m m m m Z pX5X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6XuX; ; s s s s s s j m m m m m m m m m m m m m m m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m m m m Z pX5X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6XuX; ; s s s s s s j m m m m m m m m m m m m m m m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m m m m Z pX5X6X6X6X6X|.`.`.`.`.'.+X+X+X+X#X#X#X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6XuX- ; s s s s s s j m m m m m m m m m m m m m m m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m m m m Z pX6X6X6X6X4 , , 4 4 4 , , 4 4 4 5 5 4 2 5 5 5 5 5 5 y ;.B B B ;.;.u.u.n.n.n.n.|.+X+X+X+X+X+X+X#X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6XuX% ; s s s s s s j m m m m m m m m m m m m m m m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m m m m Z aX6X6X6X6X4 , 5 4 4 4 4 4 4 4 4 4 4 4 4 4 4 , , , , , , , , , , , , , , , , , , 2 2 2 , , , 2 3 2 2 2 3 q q w u.6X6X6X6X6X6X6X6X6XuX% ; s s s s s s j m m m m m m m m m m m m m m m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m m m m Z sX6X6X6X6X4 , 6 ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 , , , , q 6X6X6X6X6X6X6X6X6XuX% ; s s s s s s j m m m m m m m m m m m m m m m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m m m m Z sX6X6X6X6X4 , 7 ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` q 6X6X6X6X6X6X6X6X6XuX% ; s s s s s s j m m m m m m m m m m m m m m m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m m m m Z sX6X6X6X6X4 , _ ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` 4 q 6X6X6X6X6X6X6X6X6XuX% ; s s s s s s j m m m m m m m m m m m m m m m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m m m m Z sX6X6X6X6X4 , 4 ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` 4 q 6X6X6X6X6X6X6X6X6XpX@ ; s s s s s s j m m m m m m m m m m m m m m m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m m m m Z sX6X6X6X6X4 , 4 ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` 4 q 6X6X6X6X6X6X6X6X6XpX@ ; s s s s s s j m m m m m m m m m m m m m m m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m m m m Z sX6X6X6X6X4 , 4 ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` 4 q 6X6X6X6X6X6X6X6X6XuX% ; s s s s s s = m m m m m m m m m m m m m m m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m m m m Z sX6X6X6X6X4 , ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` 4 0 5X6X6X6X6X6X6X6X6XuX% ; s s s s s s = m m m m m m m m m m m m m m m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m m m m Z sX6X6X6X6X4 , ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` 6 5X6X6X6X6X6X6X6X6XuX% ; s s s s s s = m m m m m m m m m m m m m m m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m m m m Z sX6X6X6X6X4 , ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` 6 5X6X6X6X6X6X6X6X6XuX% ; s s s s s s j m m m m m m m m m m m m m m m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m m m m Z sX4X6X6X6X4 , ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` 6 5X6X6X6X6X6X6X6X6XuX% ; s s s s s s j m m m m m m m m m m m m m m m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m m m m Z sX5X6X6X6X4 , ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` 6 5X6X6X6X6X6X6X6X6XuX% ; s s s s s s j m m m m m m m m m m m m m m m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m m m m C sX6X6X6X6X4 , ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` 0 5X6X6X6X6X6X6X6X6XuX$ ; s s s s s s j m m m m m m m m m m m m m m m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m m m m C sX6X6X6X6X4 , ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` 0 5X6X6X6X6X6X6X6X6XpX$ ; s s s s s s j m m m m m m m m m m m m m m m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m m m m C sX6X6X6X6X4 , ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` 0 5X6X6X6X6X6X6X6X6XpX$ ; s s s s s s j m m m m m m m m m m m m m m m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m m m m C sX6X6X6X6X4 , ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` 0 5X6X6X6X6X6X6X6X6XpX$ ; s s s s s s j m m m m m m m m m m m m m m m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m m m m C sX6X6X6X6X4 , ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' 0 4X6X6X6X6X6X6X6X6XpX$ ; s s s s s s j m m m m m m m m m m m m m m m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m m m m C sX6X6X6X6X4 , ' ' ' ' ] ' ] ' ' ' ' ] ' ' ' ' ' ] ' ' ] ] ' ' ] ' ] ' ' ' ] ' ] ' ' ' ] ' ] ' ' ] ' ' ' ] ' ] 0 4X6X6X6X6X6X6X6X6XpX$ ; s s s s s s j m m m m m m m m m m m m m m m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m m m m C aX6X6X6X6X4 , [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ 0 4X6X6X6X6X6X6X6X6XpX@ ; s s s s s s j m m m m m m m m m m m m m m m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m m m m C aX5X6X6X6X4 , [ [ [ [ [ [ [ [ [ [ [ +.o.X.#.#.#.#.#.#.#.+.+.[ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ t 4X6X6X6X6X6X6X6X6XpX$ ; s s s s s s j m m m m m m m m m m m m m m m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m m m m C aX4X6X6X6X4 , +.+.+.+.+.+.+.+.+.+.+.X.y .X.X.X.#.#.$.#.#.#.+.+.+.+.+.+.+.+.+.+.+.+.+.+.t 4X6X6X6X6X6X6X6X6XpX% ; s s s s s s j m m m m m m m m m m m m m m m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m m m m C pX5X6X6X6X4 , +.+.$.$.$.$.$.+.+.+.$.;. m.M.M.M.m.m.m.u.;.;.y &.$.+.$.$.+.$.+.+.+.+.+.+.+.t 4X6X6X6X6X6X6X6X6XpX$ ; s s s s s s j m m m m m m m m m m m m m m m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m m m m C uX5X6X6X6X4 , $.$.$.$.$.$.$.$.$.$.&.q. &X&X&X&X&X&X&X&X%X%XM.M.M.M.M.M.M.M.M.m. ;.&.$.$.$.$.$.$.$.$.$.$.$.$.t 4X6X6X6X6X6X6X6X6XpX$ ; s s s s s s j m m m m m m m m m m m m m m m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m m m m C uX6X4X6X6X4 , $.$.$.$.$.$.$.$.$.$.>.q. +X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X&X ;.>.$.$.$.$.$.$.$.$.$.$.$.$.t 4X6X6X6X6X6X6X6X6XpX$ ; s s s s s s j m m m m m m m m m m m m m m m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m m m m C yX6X4X6X6X4 , &.&.&.&.&.&.&.&.&.&.>.q. +X+X&X&X&X>X>X>X>X>X+X+X+X+X+X+X+X+X+X&X ;.>.&.&.&.&.&.&.&.&.&.&.&.&.t >X6X6X6X6X6X6X6X6XpX% ; s s s s s s j m m m m m m m m m m m m m m m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m m m m C sX6X4X6X6X4 , *.&.*.*.&.*.&.&.*.&.,.q. +X+X-Xu.;.;.u.m.m.n.%X:X9X9X7X:X-X>X+X&X ;.,.&.*.&.*.&.&.*.&.&.*.&.*.t >X6X6X6X6X6X6X6X6XpX$ ; s s s s s s j m m m m m m m m m m m m m m m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m m m m C sX6X5X6X6X4 2 >.>.>.>.>.>.>.>.>.>.,.q. +X>X-X%Xn.m.m.u.;.;.u.sXsXsXsXsXsX>X+X&X ;.,.>.>.>.>.>.>.>.>.>.>.>.>.t >X6X6X6X6X6X6X6X6XpX@ ; s s s s s s j m m m m m m m m m m m m m m m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m m m m C sX6X5X6X6X4 2 >.>.>.>.>.>.>.>.>.>.,.q. +X&X-X-X-X-X-X-X-X-X-X:X:X7X9XsXsXsX+X&X ;.,.>.>.>.>.>.>.>.>.>.>.>.>.t >X6X6X6X6X6X6X6X6XpX@ ; s s s s s s j m m m m m m m m m m m m m m m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m m m m C sX6X4X6X6X4 , ,.,.,.,.,.,.,.,.,.,.,.q. M.M.M.M.%X%X-X-X-X-X-X-X-X-X-X-X-X>X+X-X ;.,.,.,.,.,.,.,.,.,.,.,.,.,.y >X6X6X6X6X6X6X6X6XpX@ ; s s s s s s j m m m m m m m m m m m m m m m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m m m m C sX6X4X6X6X4 2 2.,.2.,.2.2.2.,.2.,.,.6. q.q.y.y.m.M.M.M.M.M.M.M.M.M.M.%X-X-X-X%X ;.6.2.,.2.,.2.2.,.2.2.2.2.2.y >X6X6X6X6X6X6X6X6XpX@ ; s s s s s s j m m m m m m m m m m m m m m m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m m m m C sX6X4X6X6X4 2 4.4.4.4.4.4.4.4.4.4.4.4. y y ;.;.;.q.q.y.y.y.m.M.M.M.M. ;.6.4.4.4.4.4.4.4.4.4.4.4.4.y >X6X6X6X6X6X6X6X6XpX@ ; s s s s s s g m m m m m m m m m m m m m m m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m m m m C sX6X4X6X6X4 2 4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.5.<. y y ;.;.;. <.5.4.4.4.4.4.4.4.4.4.4.4.4.y >X6X6X6X6X6X6X6X6XpX@ ; s s s s s s g m m m m m m m m m m m m m m m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m m m m C sX6X4X6X6X4 2 5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.<. 5.5.5.5.5.5.5.5.5.5.5.5.5.5.y >X6X6X6X6X6X6X6X6XpX@ ; s s s s s s g m m m m m m m m m m m m m m m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m m m m C sX6X4X6X6X4 2 6.5.6.6.6.6.6.6.6.6.6.5.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.5.6.6.6.6.6.6.6.6.6.6.6.6.y >X6X6X6X6X6X6X6X6XpX@ ; s s s s s : k m m m m m m m m m m m m m m m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m m m m C sX6X4X6X6X4 2 5.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.y *X6X6X6X6X6X6X6X6XpX$ ; s s s s s ; k m m m m m m m m m m m m m m m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m m m m C sX6X4X6X6X4 2 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.y *X6X6X6X6X6X6X6X6XpX$ ; s s s s s s * m m m m m m m m m m m m m m m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m m m m B sX6X4X6X6X4 2 5.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.y *X6X6X6X6X6X6X6X6XpX$ ; s s s s s s & m m m m m m m m m m m m m m m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m m m m k sX6X4X6X6X4 2 5.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.y *X6X6X6X6X6X6X6X6XpX$ ; s s s s s s j m m m m m m m m m m m m m m m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m m m m C sX6X4X6X6X4 5 5.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.y *X6X6X6X6X6X6X6X6XpX$ ; s s s s s s j m m m m m m m m m m m m m m m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m m m m C sX6X6X6X6X4 5 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.y *X6X6X6X6X6X6X6X6XpX$ ; s s s s s s j m m m m m m m m m m m m m m m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m m m m C sX6X6X6X6X4 5 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.y +X6X6X6X6X6X6X6X6XpX$ ; s s s s s s j m m m m m m m m m m m m m m m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m m m m C sX6X6X6X6X4 %.5.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.y +X>X6X6X6X6X6X6X6XpX@ ; s s s s s s j m m m m m m m m m m m m m m m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m m m m C sX6X6X6X6X4 4 y 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.y +X6X6X6X6X6X6X6X6XpX$ ; s s s s s s j m m m m m m m m m m m m m m m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m m m m C sX6X6X6X6X4 4 4 4 4 <.5.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.5.y &X6X6X6X6X6X6X6X6XpX% ; s s s s s s j m m m m m m m m m m m m m m m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m m m m C sX5X6X6X6X6Xn.'.u.;.4 4 4 4 4 4 4 <.5.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.5.q 6X6X6X6X6X6X6X6X6XpX$ ; s s s s s s j m m m m m m m m m m m m m m m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m m m m C sX5X6X6X6X6X6X6X6X6X6X+X&X&X&Xu.;.4 4 4 4 4 4 4 <.5.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.5.q 6X6X6X6X6X6X6X6X6XpX$ ; s s s s s s j m m m m m m m m m m m m m m m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m m m m C sX4X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X>X+X&X&Xn.;.4 4 4 4 4 4 4 <.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.5.q 6X6X6X6X6X6X6X6X6XpX$ ; s s s s s s j n z j k m m m m m m m m m m m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m m m m C sX4X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X4X>X+X&Xn.u.4 4 4 4 4 4 4 <.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.5.q 6X6X6X6X6X6X6X6X6XpX% ; s s s s > ; * * = k * z m m m m m m m m m m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m m m m C sX4X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X4X>X&X'.u.4 4 4 4 4 4 4 5.0.0.0.0.0.0.0.0.0.q 6X6X6X6X6X6X6X6X6XpX$ ; > ; ; % ; * W U.U.U.z = m m m m m m m m m m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m m m m C sX5X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X>X+X'.b.4 4 4 4 4 4 4 5.0.<.y 6X6X6X6X6X6X6X6X@X).$ % ; * W I.U.U.U.U.U.U.U.= k m m m m m m m m m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m m m m z sX#X4X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X>X.X'.4 4 4 4 6X6X6X6X2X!.R > s s W S.U.U.U.U.U.U.U.U.U.U.U.U.* n m m m m m m m m m m m m m m m m n m m m ", ") m m m m m m m m m m m m m m m m z aX#X#X#X#X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X#X).Q > > G W S.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.j k m m m m m m m m m m m m m v k * * n m m ", ") m m m m m m m m m m m m m m m m m n v v z C `.#X#X#X#X#X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X5X[.^ G > G T S.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.* v m m m m m m m m m n k = * M N M m m m ", ") m m m m m m m m m m m m m m m m m m m m m m n v v z z Z |.#X#X#X#X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6XR > I T S.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.k m m m m m m n k * * D D D D ; v m m m ", ") m m m m m m m m m m m m m m m m m m m m m m m m m m m n v v z z Z _.oX#X#X#X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X|.~ U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.v m m m m n k * ; D D F D D D M m m m m ", ") m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m n v z z I [.#X#X#X#X#X#X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6XS.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.Z.W I.sXsX5Xn & g G D D D D D D D D * v m m m m ", ") m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m E I > % % - ; L.OX#X#X#X#X#X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X4X~ U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.I.W I.5XsXaXZ.D # D D D D D D D D D D D D = m m m m m ", ") m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m g B I U U U I s o o o $ Q #X#X#X#X#X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X+X~ U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.Z.W Y.sXsXsX}.# D D D D D D D D D D D D D O j m m m m m ", ") m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m z l P I I I I I I I G U P > @ O o o o o O #X#X#X#X#X#X6X6X6X6X6X6X6X6X6X6XW.T U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.I.Z.U.rXsXsXsXsXsX# D D D D D D D D D D : $ o = m m m m m ", ") m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m j C Q R R T U I I I I G I I P G G > ; % $ O o o o o O #X#X#X#X#X6X6X6X6X6X6XW D U.U.U.U.U.U.U.U.U.U.U.U.Z.D.}.sXsXsXsXsXsXsXI.D D D D D D D D D D o o = m m m m m ", ") m m m m m m m m z N N j j N N z n n n n m m m m m m m m m z l E ) / ^ ! Q R R T U I G I I I P G G > ; % % @ O O o o o o o o o #X#X#X#X#X6X6XW H U.U.U.U.U.U.U.U.I.Z.Y.yXsXsXsXsXsXsXsXsXsXo D D D D D D D # = m m m m m ", ") m m m m m m n Y Y Q ~ (.[.[.~.!./.L./ E E C C z m m m m g n ).!.Q.W.) K.( ^ ! ! Q R T U U I I I P G s > ; % % @ @ O O O o o o o O O O o o o #X#X#XY # U.U.U.U.U.Z.I.OXsXsXsXsXsXsXsXsXsXsXsXW D D D D D D & Z c.M m m m m m ", ") m m m m m m v oXyXpXaXuXyX6XoX/.~ T T ~ (.].XXZ m m k v `.oX|. X[._./.!.Q.W.) ) / ^ ! T R R T U I I P G s > ; ; % % % % @ @ @ @ @ % % % ; ; ; ; $ % ; # U.I.I.}.aXsXsXsXsXsXsXsXsXsXsXsXsXyXo D D D # A OX+XsXsXR m m m m m ", ") m m m m m m v oX~ G I ~ ~.OXuXsXsXpXyXL.XXZ j j z.4X4X4X+X@XoXXX X_._.).!.Q.W.) K.^ Q ! ! Q R R T U P P G G s > > ; ; ; ; ; ; ; ; > s s G G P I G W # H ^.6XuXsXsXsXsXsXsXsXsXsXsXsXsXD D D Z.sXsXsX:XsXsXR m m m m m ", ") m m m m m m k @X~ {.~.! o $ 2X6X6X6X6X5X5X#X2X@X@XoX|. X[._./.!.Q.K.! ( / ^ ! Q R R T U I P P G G G G G G G G G G G P P I I I s U.S.W D D : # D H W S.OXuXsXsXsX}.o A }.sXsXsXsXsX7XsXsXR m m m m m ", ") m m m m m m k 5XI OXO o !.6X6X6X6X6X6X6X6X6X6X4X4X4X2X@XoXXX X[._.).!.) ) ) K.( ^ ! ! Q R R T U I I I I I I I I I I I I I P G : U.U.U.U.U.U.U.S.S.W W D : # D o W sXsXsXsXsXsXsXsX7XsXsXR m m m m m ", ") m m m m m m k 6XF o s 2X6X6X6X6X6X6X6X6X6X6X6X6X6X6X5X5X#X2X@X@XoX|. X[./.W.K.W.W.) ) / ^ ! Q R R T U I I I I I I I I P G G P F U.U.U.U.U.U.U.U.U.U.U.U.U.U.~ @ Y.sXsXsXsXsXsXsXsXsXsX9XsXsXR m m m m m ", ") m m m m m m z 6XG o ~ yXsXsXsXsX6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X4X4X4X2X@XoXXX X[./.W.K.) K.K.( ^ ! ! ! Q R T U I P G G G G P I I F U.U.U.U.U.U.U.U.U.U.U.U.U.U.W H aXsXsXsXsXsXsXsXsXsXsXsXsX0XsXsXR m m m m m ", ") m m m m m m k 6XO O ) ~ W.) !.|.sXsXsXsXsXsXsX6X6X6X6X6X6X6X6X6X6X6X5X5X#X2X@X@XoX X X[./.Q.W.) / ^ ! Q Q R R R R T U I I I I I F U.U.U.U.U.U.U.U.U.U.U.U.U.U.W Z.sXsXsXsXsXsXsXsXsXsXsXsXsXsXsX0XsXsXC m m m m m ", ") m m m m m m k yX O / / / / / / ) W.Q./.W._._.sXsXsXsXsXsXsX6X6X6X6X6X6X6X6X4X4X4X+X@XoXXX X_._.).!.Q.W.) K.( ^ ! ! Q R R T U I F U.U.U.U.U.U.U.U.U.U.U.U.U.U.W rXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsX0XsXsXN m m m m m ", ") m m m m m m k pX O / / / / / / / / / / / / / / W.Q.!.!.{.oXsXsXsXsXsXsXsXsX6X6X6X5X5X#X2X@X@XoX X X[._./.!.Q.W.) ) / ^ ! Q R R G U.U.U.U.U.U.U.U.U.U.U.U.U.U.W sXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsX0XsXsXN m m m m m ", ") m m m m m m k aX O / / / / / / / / / / / / / / / / / ~.L.~.) W.!.!.Q._._.|.sXsXsXsXsX#X#X#X#X4X+X@XoXXX X_._.).!.Q.W.) K.( ^ ! I U.U.U.U.U.U.U.U.U.U.U.U.U.U.W sXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsX0XsXsXN m m m m m ", ") m m m m m m g aX O / / / / / / / / / / / / / / / / / L.^./.K./ / / / / / ^ W.Q.!.!.!._._.sXsX#X#X#X#X#X#X#XoX|. X[._./.!.Q.W.) T U.U.U.U.U.U.U.U.U.U.U.U.U.U.W sXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsX0XsXsXN m m m m m ", ") m m m m m m j aX O / / / / / / / / / / / / / / / / / K.L.(.L./ / / / / / / / / / / / / ~ W.Q.!.!.W.) Q.sXsX#X#X#X#X#X#X_._.).!.T U.U.U.U.U.U.U.U.U.U.U.U.U.U.W sXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsX0XsXsXN m m m m m ", ") m m m m m m k rX O / / / / / / / / / / / / / / / / / ) L.(.~./ / / / / / / / / / / / / / / / / / / / ~ ) Q.!.!.( ( ( sX#X#X#X#XT U.U.U.U.U.U.U.U.U.U.U.U.U.U.W sXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXaXsXsXN m m m m m ", ") m m m m m m j {. O / / / / / / / / / / / / / / / / / / L.^.(.L./ / / / / / / / / / / / / / / / / / / / / / / / / / ~ ) Q.!._.^ P U.U.U.U.U.U.U.U.U.U.U.U.U.U.W sXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXaXsXsXN m m m m m ", ") m m m m m m j XX O / / / / / / / / / / / / / / / / / / ) L.(./.L./ / / / / / / / / / / / / / / / / / ~ ~ ~ / / / / / / / / / ~ : U.U.U.U.U.U.U.U.U.U.U.U.U.U.W sXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXaXsXsX= m m m m m ", ") m m m m m m j ^. O A./ / / / / / / / / / / / / / / / / / K.L.(.(.L.A./ / / / / / / / / / / / / / / |.|.|.|._.!.W./ ~ ~ ~ ~ / / ; U.U.U.U.U.U.U.U.U.U.U.U.U.U.D sXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXaXsXsX= m m m m m ", ") m m m m m m N J. O K.K.K.K.K.) A.A.A./ / / / / / / / / / / L.^.^.(.^.L.A./ / / / / / / / / / / / ~ |.|.|.|.|.|.|.|.|.|.|.|._.Q.s U.U.U.U.U.U.U.U.U.U.U.U.U.U.@ sXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXaXsXsX= m m m m m ", ") m m m m m m N 5XuX6XXX~ I % O W.W.W.W.W.L.L.L.K.K.K.K.) ) ) A./ / / / / K.~.L.^.(.^.L.A./ / / / / / / / / / / |.|.|.|.|.|.|.|.|.|.|.|.|.|.P U.U.U.U.U.U.U.U.U.U.U.U.U.U.@ sXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXaXsXsX= m m m m m ", ") m m m m m m N 4X4X4X5X5X6XyXaXsX6X].T O !.!.Q.~.~.~.~.W.W.W.W.W.W.L.L.L.K.K.K.K.) ) K.L.~.L.^.(.^.L.) / / / / / / / / / K.W.[.|.|.|.|.|.|.|.|.|.|.|.P U.U.U.U.U.U.U.U.U.U.U.U.U.U.@ sXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXaXsXsX= m m m m m ", ") m m m m m m N 5X6X6X5X4X4X5X].~ OX6X_.O )./././././.!.!.!.!.Q.~.~.~.~.W.W.W.W.W.W.L.L.L.L.W./.^.(.^.^.~.L.L.L.K.A./ / / / / / / ~ ~ ~ ~ W.Q._.|.|.|.P U.U.U.U.U.U.U.U.U.U.U.U.U.U.@ sXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsX= m m m m m ", ") m m m m m m B oXoX2XOX4X4X[.O % o OX!.O ].].].].].).).).)./././././.!.!.!.!.Q.~.~.~.~.W.W.W.W.~.(.].].^.^.^.^././.^.~.~.L.L.L.K.A./ / / / / / ~ ~ ~ ; U.U.U.U.U.U.U.U.U.U.U.U.U.U.@ sXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsX= m m m m m ", ") m m m m m m C 2XT ~ 2X4X4X^.@ s @ /.!.$ [.[.[.[.[.[.[.[.].].].].].).).).)./././././.!.!.!.!.Q.~.Q./.(.].].].(.(.(.(.^.(.(.(.(.(./.^.~.~.W.L.L.K.A./ % U.U.U.U.U.U.U.U.U.U.U.U.U.U.@ sXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXiX= m m m m m ", ") m m m m m v C 5X4X4X4X4X4X5X; @ ; 5X!.O (.[.oXXX X X X[.[.[.[.[.[.[.[.[.].].].].].).).).)././././././././././.(.(.(.(.(.(.^.(.^.^.^.(.(.].].(.(./.^.; U.U.U.U.U.U.U.U.U.U.U.U.U.U.@ sXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXaX= m m m m m ", ") m m m m m n z z E `..X4X4X5XyXOXyX6X_.O J.Q T W ~ L.^.].[.XXXX X X X X[.[.[.[.[.[.[.[.[.].].].].].).).).)././././././././././.(.(.(.(./.^./.(.^.^.(.: U.U.U.U.U.U.U.U.U.U.U.U.U.U.@ sXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXaX= m m m m m ", ") m m m m m m m m k v j j j * Y ) !.Q : ; @XOXOXOX[./.~.S.W T W S.~.(.].oXXXXXXX X X X X[.[.[.[.[.[.[.[.[.].].].].].).).).)./././././././././.(.(.(.(.: U.U.U.U.U.U.U.U.U.U.U.U.U.U.@ sXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXaX= m m m m m ", ") m m m m m m n C z.4X4XOX).W.R G $ % ; G R ( ). XXXoXoXoXoXOXXX[./.J.~ W T Q A./.].[.oXXXXXXXXX X X X X[.[.[.[.[.[.[.[.[.].].].].].).).).)./././././.s U.U.U.U.U.U.U.U.U.U.U.U.U.U.@ sXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXaX= m m m m m ", ") m m m m m m B C 4X4X4X4X4X4X4X4X4X@X[.) Q G % @ ; I Y ) ). XoXoXoXoXoXOX@X[.]./.A.Q T W ~ J./.[. XoXXXXXXXXXXX X X X X[.[.[.[.[.[.[.[.[.].].].].].).T U.U.U.U.U.U.U.U.U.U.U.U.U.U.+ sXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXaX= m m m m m ", ") m m m m m v P @X4X4X4X4X4X4X4X4X4X4X4X4X4X4X4X4X XW.! P ; O ; P R ) `. XoXoXoXoXoXoXOXOX[.].~.S.W T W S.~./.[.OXoXoXXXXXXXXXXX X X X X[.[.[.[.[.[.[.T U.U.U.U.U.U.U.U.U.U.U.U.U.U.+ sXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXaX= m m m m m ", ") m m m m m N ) 4X4X4X4X5X6X6X4X4X4X4X4X4X4X4X4X4X4X4X4X4X4X4X[.Q.! P ; O ; G R ( !.[.oXoXoXoXoXoXOXOXXX[./.L.~ W T W A./.].[.OXoXoXXXXXXXXXXXXX X X XT U.U.U.U.U.U.U.U.U.U.U.U.U.U.+ sXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXaX= m m m m m ", ") m m m m v R 4X4X4XJ.~ XXW 6X4X4X4X5X6X5X4X4X4X4X4X4X4X4X4X4X4X4X4X4X4X XQ.Q I ; O ; G R ( !.[. XoXoXoXoXoXoXOXOX{.]./.A.Q T W ~ J./.].XXOXoXoXoXXXT U.U.U.U.U.U.U.U.U.U.U.U.U.U.+ @ sXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsX0X= m m m m m ", ") m m m m B !.4X4X4X].T @ 2X5XXX/.2XOX uX5X6X4X5X4X4X4X4X4X4X4X4X4X4X4X4X4X4X4X4X#XoX~.Q P - O @ G R ( !.[.|.oXoXoXoXoXoXOXOXOX[.].^.A.W T W ~ ~./.T U.U.U.U.U.U.U.U.U.U.U.U.U.U.+ @ sXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsX0X= m m m m m ", ") m m m z R 4X4X4X4X4X5X6X6X4X4X[.F o Q T J.L. 6X6X6XL.5X4X4X4X4X4X4X4X4X4X4X4X4X4X4X4X4X4X4X5X@X~.Q G % O O ; Y ( !._.|.@XOXoXoXoXoXoXOXOXXX[./.L.F U.U.U.U.U.U.U.U.U.U.U.U.U.U.+ @ sXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsX0X= m m m m m ", ") m m m Y !.4X4X4X4X4X4X4X4X4X4X4X5X6X6X5X~.Q ~ - Q 5XyXuXT [.4X4X4X4X4X4X4X4X4X4X4X4X4X4X4X4X4X4X4X5X5X2XQ.Q F @ O O @ G R !._..X4X@XOXoXoXoXoXG U.U.U.U.U.U.U.U.U.U.U.U.U.U.+ sXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsX0X= m m m m m ", ") m m z R b.4X4X4X4X4X4X4X4X4X4X4X4X4X4X4X4X5X6X6X5X[.T ].o o 5X5X5X6XyX~./.4X4X5X5X4X4X4X4X4X4X4X4X4X4X4X4X4X4X5X5X6X4X~.Q F $ O O O - Y ! '.+X4XI U.U.U.U.U.U.U.U.U.U.U.U.U.U.o sXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsX0X= m m m m m ", ") m m U !.b.4X4X6X6XyX~ 5X4X4X4X4X4X4X4X4X4X4X4X4X4X4X5X5X6X6X2X{.5X5X : L.2XuX~.o 6X4X5X6X5X4X4X4X4X4X4X4X4X4X4X4X4X4X4X4X5X6X6X5X~.Q T @ O O O # U.U.U.U.U.U.U.U.U.U.U.U.U.U.o sXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsX0X= m m m m m ", ") m z R b.#X4XXX - T 5X4X5X6X6X[.5X4X4X4X4X4X4X4X4X4X4X4X4X4X4X4X4X5X6X[.~.J. A.J.XX^. uX6X6XXX5X4X4X4X4X4X4X4X4X4X4X4X4X4X4X4X4X4X5X6X6X5X^.F U.U.U.U.U.U.U.U.U.U.U.U.U.U.o sXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsX0X= m m m m m ", ") m U _.+X4X4X4X5X[.G {.5X5X P A. XXyXuXJ.[.4X4X5X5X4X4X4X4X4X4X4X4X4X4X4X4X5X6X6XuX].Q @ ~ - ~ W 6X4X5X5X6X4X5X4X4X4X4X4X4X4X4X4X4X4X4X4X4X4X4XT U.U.U.U.U.U.U.U.U.U.U.U.U.U.o sXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsX8X= m m m m m ", ") z R .X4X4X4X4X4X4X5X5X4X5XXX~.P ~ O - L.2XuXJ.: 6X5X5X6X4X4X4X4X4X4X4X4X4X4X4X4X4X5X6X6X5X[.J.o {.5XXX@ J.(. 6X6X6X/.2X4X4X4X4X4X4X4X4X4X4X4X4XT U.U.U.U.U.U.U.U.U.U.U.U.U.U. sXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsX:X= m m m m m ", ") U X4X4X+X4X4X4X5X6X6X[.5X5X6X6X6X6X6X].(.A. A.J.XX~ 6X4X4X4X5X6X5X4X4X4X4X4X4X4X4X4X4X4X5X5X5X4X2X~.Q ~ - Q (.yXuXJ./.5X4X5X5X4X4X4X4XT U.U.U.U.U.U.U.U.U.U.U.U.U.U. sXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsX:X= m m m m m ", ") R @X4X4X+X4X4XXX T T 6XyXuXT XX4X5X6X6X6X6XyXuX].T @ {.5XXX/.5XOX uX5X6X4X5X4X4X4X4X4X4X4X4X4X4X4X4X4X5X6X6X6X].Q L.@ o A.[.pX~ o 4X4X4X4XT U.U.U.U.U.U.U.U.U.U.U.U.U.U. sXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsX:X= m m m m m ", ") oX4X4X4X@X5X6X5XOX~.F {. O ].5XpX- J.6X5X6X6X5X5X6X6X5X4XXX- o Q T J.L. 6X6X6X/.5X4X4X5X4X4X4X4X4X4X4X4X4X4X4X5X5X6X6X2X].L.@ 2X4X4X5X6XG U.U.U.U.U.U.U.U.U.U.U.U.U.U. sXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsX:X= m m m m m ", ") .X4X4X4X.XJ.L. 5X6X6X6XyX6X].5XT J.L.XXo 5X4X5X4X5X6X5X6X6XyX4X~.T ~ - Q XXyXuXQ [.4X4X4X4X4X4X4X4X4X4X4X4X4X4X4X4X5X6X6X6X4X4X4X~ # U.U.U.U.U.U.U.U.U.U.U.U.U.U. sXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXc.* z m m m m ", ") Z .X4X4X.XQ o J.5X4XA.~.2XuXaX~ ~.yXyXuX/.T % 6X5X(./.6XJ. yX6X6X5X5X5X6X6X6X6X].T ^.o o OX5X5X6XyX/./.4X4X4X5X4X4X4X4X4X4X4X4X4X4X4X4X4X5X6XF U.U.U.U.U.U.U.U.U.U.U.U.U.U. o sXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsX&XN k m m m m m ", ") B b.4X4X.X6X6X5X4X4XA.G o o OX4X5X6XyXyXuXyX5X5X].: A.I L.~ pX6XyX~.6X4X5X6X6X6X6XOX].5X5Xo F A.2XuX(.o 6X5X5X6X5X4X4X4X4X4X4X4X4X4X4XF U.U.U.U.U.U.U.U.U.U.U.U.U.U. @ sXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXC * z m m m m m m ", ") U c.'.`.z.6X6X6X4X4X5X6X6X6X2X].5X4X[. @ Q ~.2X6X6X6XyXuXuX4X~.T A. ; : 5XyXuX: XX4X4X4X5X5X5X6X6X{.J.L. ~ J.XX^. uX6X6XXX5X4X4X4X4X4X4XF U.U.U.U.U.U.U.U.U.U.U.U.U.U. @ sXsXsXsXsXsXsXsXsXsXsXsXsXsX@X* M n m m m m m m m ", ") n U U U B G : T ~.6X6X6X6X6X5X5X4X4X4X6X[.L.G o : J.[.6XyXyXuXuXyX5X].T [.o 6X5X6X6XuX~ [.4X5X6X6X6X6XyXuX[.W @ ~ - ~ Q 6X4X4X4X4X5X6XF U.U.U.U.U.U.U.U.U.U.U.U.U.U. # sXsXsXsXsXsXsXsXsXsXsXsXsX! * k m m m m m m m m m ", ") m n z C C P * M N N G s s A.[.6X6X6X6X5X5X5X6X6X6X5X/.~ @ @ Q ~.2XyXuXuXyXyXpXOX5X5X5X - (.5XpXW T 6X5X6X6X5X5X6XyX6X].J.o {.5X4X4X~ [.aX I U.U.U.U.U.U.U.U.U.U.U.U.U.U. W sXsXsXsXsXsXsXsXsXsXsXuXk * z m m m m m m m m m m ", ") m m m m m m m m m n z * = N N T G : T L.6X6X6X6X6X5X5X5X6X6X6X[.L.G o o : J.[.pX J.4X4X6X6X^.{.Q J.L.XXQ uX6X6X[.5X4X5X6X4X4X4X2XG @ !.U.U.U.U.U.U.U.U.U.U.U.U.U.U. W sXsXsXsXsXsXsXsXsXsX5X= = n m m m m m m m m m m m ", ") m m m m m m m m m m m m m m m k & = M M N T F P A.XX6X6X6X6X5X5X5X6X6X6X5X/.~ % yX4X4X5X6XyXyXyXyXuXaX].T % ~ F A.% 6X4X4X4X4X5X6X5X5X6X6X6X) U.U.U.U.U.U.U.U.U.U.U.U.U.U. W sXsXsXsXsXsXsXsXsX).* k m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m m m m m m m m n z & M N M T P F W L.6X6X6X6X6X5X5X5X6X6X6X4X4X4Xo o : J.[.yXJ. yX6X6X5X].J. 6X5X4XOXS.[.yX 4X4X4X4X4X) U.U.U.U.U.U.U.U.U.U.U.U.U.U. D sXsXsXsXsXsXsXsXk * z m m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m m m m m m m m m m m m m n k & * M N F T P P ~ XX6X6X6X6X5X4X4X4X6X6XOX/.~ @ {.4X4X4X5X6XuXyX6X4X5X5XT @ F 6X4X4X4X4X) U.U.U.U.U.U.U.U.U.U.U.U.U.U. # sXsXsXsXsXsXyXM = n m m m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m z & & M M s P T F W L.5X6X6X6X6X5X5X5X6X6X6X5X4X4X4X(. : J.].6XaX 6X6X6X5X4X4X4X4X4XR U.U.U.U.U.U.U.U.U.U.U.U.U.U.o # sXsXsXsXsX@X* j n m m m m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m n z X * M M F T T T ~ XX6X6X6X6X5X4X4X4X4X5X2X/.~ @ 6X4X4X4X4X4X4X4X@X! U.U.U.U.U.U.U.U.U.U.U.U.U.U.o # sXsXsXsXE * z m m m m m m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m n z X & * M s P T P W L.5X6X6X6X5X5X5X5X6X6X6X6X4X4X4X4X4X4X4X5X^.M U.U.U.U.U.U.U.U.U.U.U.U.U.U.o # sXsXaXj * v m m m m m m m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m n z & X * M M F T T I ~ [.6X6X6X6X5X4X4X4X4X4X4X4X4X].A.= U.U.U.U.U.U.U.U.U.U.U.U.U.U.o # sX6X* M n m m m m m m m m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m n z X X = M > P T P T L.2X6X6X6X5X4X4X5X(.* k U.U.U.U.U.U.U.U.U.U.U.U.U.U. # _.* k m m m m m m m m m m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m n z & X = M > F T T T ~ ].5XL.~ v k N z S.I.U.U.U.U.U.U.U.U.U.U. M * v m m m m m m m m m m m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m n z & X X = > F P J.v n z j = * * M N ~ U.U.U.U.U.U.U. $ = n m m m m m m m m m m m m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m z z X l v m m m m m v k M * * = T ~ U.U.U. o * g m m m m m m m m m m m m m m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m n m m m m m m m m m m v k j * * = T O * k m m m m m m m m m m m m m m m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m n z j = v m m m m m m m m m m m m m m m m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m n v c c c v n m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m c g V c <.z.r.q.e.e.0.a.p.p p k c m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m n c f k.d.z.9.9.8.6.8.6.6.,.6.7.q.W J p.p.a.g v n m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m m m m m m m m a.b.b.b.n.n.%X%X=X.>.;.p p p.J j m m m m m m m m m m m m m m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m m c.;X;XN.N.f.f.f.f.f.j.b.b.n.n.$X=XqXsXsXsXtXtXtXtXiX:Xm.m m m m m m m m m m m m 1.u.T.F.b.9.r.r.r.r.9.9.9.r.e.! j.B u.y ;.Z.V.V.V.B.< 7.3.3.2.2.>.*.-.h *.p.L o.b m m m m m m m m m m m m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m m c.1X1X;X;XN.l.f.f.f.f.j.b.n.n.%X=X.>.>.>.%.&.:.$.#.J #.l m m m m m m m m m m m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m m ,XwX1X1X1X;XN.N.f.f.f.f.j.`.n.n.$X.>.&.%.#.@.@.@.Y S | k m m m m m m m m m m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m n sXeXwXwX1X1X;X;XN.l.f.f.f.j.b.n.%X=XiXsXsXtXtXtXiXeXwX1X;X;XN.N.m m m m m x b.q.2.c.q.v.q.R.k.m.9.w.9.j.k.d.0.c.6.n z ;.V g.U 3.7.3.u.P y 2.2.>.>.&.%.%.@.@.o.o.G S Y k m m m m m m m m m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m X sXiXiXeXwXwX1X1X;X;Xl.f.f.f.b.b.n.$X7XsXsXtXtXtXeXwX1X;X;XN.N.N.l.m m m x r.9.9.r.r.r.j.k.D.C.H.l.k.l.v.a.p.n a.k.j.g.9.q.d.D.:.2.2.2.3.3.>.>.>.>.&.%.%.@.o.o...' V 8 K l m m m m m m m m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m j sXiXiXiXiXeXwXwX1X1X;XN.f.f.f.b.n.%X.*.*.&.&.#.%.%.%.o. .} } _ D L v m m m m m m m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m v sXsXsXsXiXiXiXeXeXwX1X;XN.l.f.a.`.n.=XsXsXtXtXeXwX1X;XN.N.l.l.a.a.a.a.;.9.w.w.r.e.c.T.D.P.P.P.P.Z.k.G.T.E.T.k.d.d.<.r.q.q.F.g.O.G.s 7.=.2.&.&.&.$.#.#.@.@.O. . .} { { | K J m m m m m m m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m v _.sXsXsXsXsXsXiXiXiXeXwX1X;XN.f.f.b.%XqXsXtXtXwX1X;XN.l.l.a.a.a.a.V V V 6.r.w.r.e.v.c.y.u.Z.P.P.Z.G.F.k.G.T.G.k.p.9.8.8.7.a.h.h.g.H.g.g.V 3.>.%.%.@.@.@.@.o.O. .} { { { y J V m m m m m m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m v 0XsXsXsXsXsXsXsXsXsXiXiXeXwX1XN.f.a.'..o.o.o.o.o. . .} { 7 7 { h d f m m m m m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m m g |.eXeXiXiXiXsXsXsXsXsXsXsXsXsXsXsXN.g u.qXN.a.V V V N N N N N N N N N N N ;.r.r.t.t.t.v.v.U.Z.P.E.E.E.E.E.G.G.k.k.d.d.p.:.c.h.F.C.9 E =.:.*.&.:.O.o.o..... . .{ | 7 7 { ..f g.g m m m m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m m v = 7X*X:X:X:X:X:X:X:X7X7X7XqXqXeXiXc.z.z.x X N = = u u u u u u u B u B B B B r.r.t.t.t.t.v.~ E.Y.P.P.E.E.E.h.k.k.G.G.h.p.p.k.h.h.h.W g.h V >.o.@.@.@.o..... . .{ { e 6 7 { h J f m m m m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m m m . P &X'.'.'.'.'.'.'.'.'.'.'.'.'.'.&Xz.z.z.z.* qX'.b.u.E E E B B B B B B B B B t.t.t.t.v.v.m.Z.P.Z.C.E.E.E.E.h.k.T.G.h.g.h.h.h.h.a D.i k ..%.@.@.o.......} . .{ e 7 7 7 { @.d J g m m m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m m m m N `.'.'.'.'.'.'.'.'.'.'.&X&X:X7XiX7Xz.z.z.z.iXsXsXsXsXiX7X,X&X'.n.b.u.u.u.E u.t.t.t.v.v.m.( P.I.Z.E.E.T.E.E.h.G.T.a p.G.g.h.d g.C.7 *.%.o.o.o.o.....} } } | { e 6 7 7 { } y d f n m m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m m m m l $ &X'.'.'.'.'.&X&X&X:X:X7XeXiXsXsX9X.>.z O.;.K A K S 8 } { .h p 6 7 e 6 0 8 q 3 5 3 3 q 8 r q | | | O.O.O.O.X.X. .....*.n m m m m m m m m m m m m ", ") m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m n m u.j.|.`.8XwXwXwXwXwXeXeXiX7XR u.3.3.2.2.2.2.2.2.2.>.>.>.>.>. .&.;.K A + a } | _ p . 7 e 3 5 w 3 3 3 2 2 2 5 q q r r O.| | O.| O.X. . ...o.*.m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m.Z -Xu.n.n.u.u.u z q.3.3.3.2.3.*.2.2.*.2.*.>.>.%.%.%.-.o.;.K K H A X y g d . 6 0 e q 3 3 2 2 8 q 8 8 * p j y y V y O.| | X.X.o. .o.&.m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m O.2.2.3.3.3.3.3.*.*.*.*.*.*.*.*.&.&.&.%.%.%.O.O.X. .{ , S H # S K S * D.S X 5 2 2 2 5 & J + . i J f d f J d y O.X.O.g y o.o. .m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m y *.*.*.*.*.*.*.*.*.*.*.*.*.&.&.&.%.%.%.@.O.O. . .X. .} 7 5 , 6 5 $ + + + . 5 2 2 3 f . U . p.A L + a J J d h g p p.f S +.@.y m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m l 3.*.*.*.*.*.*.*.*.*.*.&.$.&.%.%.@.%.@.o.o. .X.{ .| e e e 0 5 3 5 5 3 9 + 1 2 9 j a F . . g.A # a a f J a p p.i f C.& @.$.l m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m b 3.*.&.*.*.&.*.*.&.&.$.$.#.%.#.@.@.o.o.o. . . .{ | t e 0 0 5 3 3 3 2 2 3 2 $ % 2 & o A . a . f # a f p f i i f J f L } o.3.v m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m %.$.&.&.$.&.$.$.#.#.#.#.#.@.@.@.o.o. . . . .{ { e e 0 q 5 3 3 2 2 2 1 1 1 1 1 1 2 G # a a . a . i a i p f J f J C.a $.@.*.m m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m h #.#.%.#.#.#.#.#.#.@.@.o.@.o.o. . . . .{ { e e 0 0 5 5 3 2 2 1 1 1 1 1 1 , 1 , q : a a . a i i i i i p J J f L L & $.@.h m m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m v &.@.@.#.#.@.@.@.@.@.o.o.o. . . . . .{ { e e 0 0 q q 3 3 2 1 1 1 1 1 1 , , , 2 E + a . i i i i i i p J J J f K C.j #.*.v m m m m m m m m m m m m m m ", ") m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m n n m c.c.m.&X0XtX3X3X3X3XX:X:X7Xvalue(), file_types, _("Package selection")); if (f) { package_name_input->value(f); } ;} Fl_Check_Button* nodeps_button; Fl_Group* step2_group; Fl_Text_Editor* result_output; Fl_ProgressBar* install_progress; Fl_Button* prev_button; static void cb_prev_button(Fl_Button*, void*) { step1_group->show(); step2_group->hide(); prev_button->deactivate(); } Fl_Button* next_button; static void cb_next_button(Fl_Button*, void*) { step1_group->hide(); step2_group->show(); prev_button->activate(); install_package(); } static void cb_Close(Fl_Button*, void*) { exit(0); } int main (int argc, char **argv) { Fl_Window* w; fl_init_locale_support("einstaller", PREFIX"/share/locale"); out_buffer = new Fl_Text_Buffer(); {Fl_Window* o = install_window = new Fl_Window(505, 310, _("Install software package")); w = o; {Fl_Box* o = new Fl_Box(5, 5, 135, 270); o->image(Fl_Image::read_xpm(/*"icons/install.xpm"*/0, (const char**)datas_install)); o->box(FL_DOWN_BOX); o->color((Fl_Color)0x7d8300); } {Fl_Group* o = steps_group = new Fl_Group(140, 0, 355, 275); o->box(FL_FLAT_BOX); {Fl_Group* o = step1_group = new Fl_Group(5, 5, 350, 270); o->box(FL_ENGRAVED_BOX); {Fl_Input* o = package_name_input = new Fl_Input(10, 132, 250, 23, _("Enter the name of software package you want to install:")); o->align(133); ; } {Fl_Button* o = new Fl_Button(265, 132, 80, 25, _("&Browse...")); o->callback((Fl_Callback*)cb_Browse); } {Fl_Box* o = new Fl_Box(5, 5, 340, 90, _("Welcome. This installation wizard will help you to install new software on yo\ ur computer.")); o->label_size(18); o->align(133|FL_ALIGN_INSIDE); ; } {Fl_Check_Button* o = nodeps_button = new Fl_Check_Button(7, 165, 338, 25, _("Ignore dependencies")); ; } o->end(); } {Fl_Group* o = step2_group = new Fl_Group(5, 5, 350, 270); o->box(FL_ENGRAVED_BOX); o->hide(); {Fl_Text_Editor* o = result_output = new Fl_Text_Editor(10, 25, 335, 155, _("Installation results:")); o->align(133); ; o->buffer(out_buffer); } {Fl_ProgressBar* o = install_progress = new Fl_ProgressBar(10, 215, 335, 20, _("Installation status:")); o->align(FL_ALIGN_TOP | FL_ALIGN_LEFT); ; } o->end(); } o->end(); } {Fl_Button* o = prev_button = new Fl_Button(230, 280, 80, 25, _("<< &Previous")); o->callback((Fl_Callback*)cb_prev_button); o->deactivate(); ; } {Fl_Button* o = next_button = new Fl_Button(315, 280, 80, 25, _("&Install")); o->callback((Fl_Callback*)cb_next_button); ; } {Fl_Button* o = new Fl_Button(415, 280, 80, 25, _("&Close")); o->callback((Fl_Callback*)cb_Close); ; } ; o->end(); } w->show(argc, argv); return Fl::run(); } the urls are http://www.hypertextnavigation.com/unixgui.htm http://developer.gnome.org/projects/gup/hig/2.0/ http://developer.apple.com/documentation/UserExperience/Conceptual/OSXHIGuidelines/index.html As you can plainly see I am working on it. I'm working on providing the gui that would be the best that could be created. It would include facilities for utilising the whole power of unix, with an easy to understand interface. (i'm trying to base it more on the gnome hig, so it's composed of small tools, with a minimalistic look and feel that has none of the features removed) It will include tools to install modules into the kernel, the engines and servers, and apps, it will include tools to manage networking, inc dhcp, dns, vnc, tcp/ip, ssh etc. and everything else that a full featured gui would need. _________________________________________________________________ Winks & nudges are here - download MSN Messenger 7.0 today! http://messenger.msn.co.uk From owner-freebsd-arch@FreeBSD.ORG Sun Jun 19 18:30:50 2005 Return-Path: X-Original-To: freebsd-arch@freebsd.org Delivered-To: freebsd-arch@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 818DD16A41C for ; Sun, 19 Jun 2005 18:30:50 +0000 (GMT) (envelope-from sgk@troutmask.apl.washington.edu) Received: from troutmask.apl.washington.edu (troutmask.apl.washington.edu [128.208.78.105]) by mx1.FreeBSD.org (Postfix) with ESMTP id 46E3B43D49 for ; Sun, 19 Jun 2005 18:30:50 +0000 (GMT) (envelope-from sgk@troutmask.apl.washington.edu) Received: from troutmask.apl.washington.edu (localhost [127.0.0.1]) by troutmask.apl.washington.edu (8.13.4/8.13.4) with ESMTP id j5JIUoai001926; Sun, 19 Jun 2005 11:30:50 -0700 (PDT) (envelope-from sgk@troutmask.apl.washington.edu) Received: (from sgk@localhost) by troutmask.apl.washington.edu (8.13.4/8.13.1/Submit) id j5JIUnFG001925; Sun, 19 Jun 2005 11:30:49 -0700 (PDT) (envelope-from sgk) Date: Sun, 19 Jun 2005 11:30:49 -0700 From: Steve Kargl To: DANIEL hoggan Message-ID: <20050619183049.GA1873@troutmask.apl.washington.edu> References: Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.4.2.1i Cc: freebsd-arch@freebsd.org Subject: Re: Request to mailing list freebsd-arch rejected-gui for unix X-BeenThere: freebsd-arch@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Discussion related to FreeBSD architecture List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 19 Jun 2005 18:30:50 -0000 On Sun, Jun 19, 2005 at 12:42:10PM +0000, DANIEL hoggan wrote: > > >Your request to the freebsd-arch mailing list > > > > Posting of your message titled "Hot plugging systems" > > > >has been rejected by the list moderator. The moderator gave the > >following reason for rejecting your request: > > > >"Quite aside for the tone of your post, which comes across in a way > >that is very unlikely to encourage the volunteers who write the code > >to have any desire to cooperate with you, your message came out to > >about 3.3 MB; the upper limit on messages for nearly all FreeBSD.org > >mailing lists is 200 KB. There is no need to "attach" additional > >material to your message -- merely provide a URL, and allow those who > >are sufficiently interested in what you have to say to go look. > > > >But in order for that strategy to be effective, you will need to craft > >your message appropriately; it would be ideal if you were to be able > >to show a body of code that you had either created or sponsored: it > >need nbe complete, but ot generally, there is a very strong perception > >that code speak a lot louder than words. > > > > -- postmaster@freebsd.org" > > Here is my code: > > /**************************************************************************** > This file is brought to you by the gpl and is available as part of the gge2d > graphics engine, This code is unfinished and is only partly complete, this > file is to be the complete header file for the graphical component for the > gge > if you have the time maby you coluld puruse this file and tell me of any > problems, bugs or comments you may have. > ###END### > > *****************************************************************************/ What is the point of this post? 2000+ LOC sent to mailing list without previous discussion of the code is somewhat pointless. I would suggest that you summarize what the code does and post a URL to the code. If this is kernel code and you wrote the code, why the GPL? -- steve From owner-freebsd-arch@FreeBSD.ORG Sun Jun 19 21:19:05 2005 Return-Path: X-Original-To: freebsd-arch@freebsd.org Delivered-To: freebsd-arch@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id E5CC816A41C for ; Sun, 19 Jun 2005 21:19:05 +0000 (GMT) (envelope-from keramida@freebsd.org) Received: from nic.ach.sch.gr (nic.sch.gr [194.63.238.4]) by mx1.FreeBSD.org (Postfix) with ESMTP id EED2D43D48 for ; Sun, 19 Jun 2005 21:19:04 +0000 (GMT) (envelope-from keramida@freebsd.org) Received: (qmail 5416 invoked by uid 207); 19 Jun 2005 21:19:03 -0000 Received: from keramida@freebsd.org by nic by uid 201 with qmail-scanner-1.21 (sophie: 3.04/2.19/3.81. Clear:RC:1(81.186.70.80):. Processed in 0.591419 secs); 19 Jun 2005 21:19:03 -0000 Received: from dialup80.ach.sch.gr (HELO gothmog.gr) ([81.186.70.80]) (envelope-sender ) by nic.sch.gr (qmail-ldap-1.03) with DES-CBC3-SHA encrypted SMTP for ; 19 Jun 2005 21:19:02 -0000 Received: from gothmog.gr (gothmog [127.0.0.1]) by gothmog.gr (8.13.4/8.13.4) with ESMTP id j5JLIpf5000695; Mon, 20 Jun 2005 00:18:51 +0300 (EEST) (envelope-from keramida@freebsd.org) Received: (from giorgos@localhost) by gothmog.gr (8.13.4/8.13.4/Submit) id j5JLIlv4000678; Mon, 20 Jun 2005 00:18:47 +0300 (EEST) (envelope-from keramida@freebsd.org) Date: Mon, 20 Jun 2005 00:18:44 +0300 From: Giorgos Keramidas To: Daniel Hoggan Message-ID: <20050619211844.GA635@gothmog.gr> References: Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: Cc: freebsd-arch@freebsd.org Subject: Re: Request to mailing list freebsd-arch rejected-gui for unix X-BeenThere: freebsd-arch@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Discussion related to FreeBSD architecture List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 19 Jun 2005 21:19:06 -0000 On 2005-06-19 12:42, DANIEL hoggan wrote: > >But in order for that strategy to be effective, you will need to craft > >your message appropriately; it would be ideal if you were to be able > >to show a body of code that you had either created or sponsored: it > >need nbe complete, but ot generally, there is a very strong perception > >that code speak a lot louder than words. > > > > -- postmaster@freebsd.org" > > Here is my code: > > /**************************************************************************** > This file is brought to you by the gpl and is available as part of the gge2d > graphics engine, This code is unfinished and is only partly complete, this > file is to be the complete header file for the graphical component for the > gge > if you have the time maby you coluld puruse this file and tell me of any > problems, bugs or comments you may have. > ###END### This is GPL code, and we all know how this is *NOT* the preferred way of extending a BSD system :) From owner-freebsd-arch@FreeBSD.ORG Mon Jun 20 06:52:09 2005 Return-Path: X-Original-To: freebsd-arch@freebsd.org Delivered-To: freebsd-arch@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 52F1416A41C for ; Mon, 20 Jun 2005 06:52:09 +0000 (GMT) (envelope-from yuri@tsoft.com) Received: from ylpvm15.prodigy.net (ylpvm15-ext.prodigy.net [207.115.57.46]) by mx1.FreeBSD.org (Postfix) with ESMTP id 1118943D1F for ; Mon, 20 Jun 2005 06:52:08 +0000 (GMT) (envelope-from yuri@tsoft.com) Received: from pimout7-ext.prodigy.net (pimout7-int.prodigy.net [207.115.4.147]) by ylpvm15.prodigy.net (8.12.10 outbound/8.12.10) with ESMTP id j5K6qJNs016631 for ; Mon, 20 Jun 2005 02:52:19 -0400 X-ORBL: [63.206.193.240] Received: from eagle.syrec.org (adsl-63-206-193-240.dsl.snfc21.pacbell.net [63.206.193.240]) by pimout7-ext.prodigy.net (8.12.10 milter /8.12.10) with ESMTP id j5K6q7XM124250 for ; Mon, 20 Jun 2005 02:52:07 -0400 Received: from [127.0.0.1] (localhost.syrec.org [127.0.0.1]) by eagle.syrec.org (8.13.3/8.13.3) with ESMTP id j5K6r47a043379 for ; Sun, 19 Jun 2005 23:53:05 -0700 (PDT) (envelope-from yuri@tsoft.com) Message-ID: <42B667D0.8020003@tsoft.com> Date: Sun, 19 Jun 2005 23:53:04 -0700 From: Yuri User-Agent: Mozilla Thunderbird 1.0.2 (X11/20050404) X-Accept-Language: en-us, en MIME-Version: 1.0 To: freebsd-arch@freebsd.org Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Subject: Plans to support web-cams on FreeBSD ? X-BeenThere: freebsd-arch@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Discussion related to FreeBSD architecture List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 20 Jun 2005 06:52:09 -0000 Are there plans to support webcams under FreeBSD ? Under Linux there are many drivers supporting many webcams exposing them as device with some standardised access. Under Windows there's whole driver infrastructure of camera devices. In FreeBSD I couldn't only find old bt848 driver, driver for some obsolete parallel port camera and pwc_bsd project supporting newer Philips PWC chipset. It must be possible to make some infrastructure allowing to use linux videodevice drivers with minimal changes. Thanx, Yuri From owner-freebsd-arch@FreeBSD.ORG Mon Jun 20 07:46:50 2005 Return-Path: X-Original-To: freebsd-arch@freebsd.org Delivered-To: freebsd-arch@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 5ACFB16A41C; Mon, 20 Jun 2005 07:46:50 +0000 (GMT) (envelope-from drosih@rpi.edu) Received: from smtp4.server.rpi.edu (smtp4.server.rpi.edu [128.113.2.4]) by mx1.FreeBSD.org (Postfix) with ESMTP id 17F0243D53; Mon, 20 Jun 2005 07:46:49 +0000 (GMT) (envelope-from drosih@rpi.edu) Received: from [128.113.24.47] (gilead.netel.rpi.edu [128.113.24.47]) by smtp4.server.rpi.edu (8.13.0/8.13.0) with ESMTP id j5K7kja6018632; Mon, 20 Jun 2005 03:46:47 -0400 Mime-Version: 1.0 Message-Id: In-Reply-To: <20050613090808.GB1789@isis.sigpipe.cz> References: <200506090027.j590R2t0070899@repoman.freebsd.org> <20050609003619.GA10578@xor.obsecurity.org> <20050609100815.GB16677@over-yonder.net> <20050609160316.GC16677@over-yonder.net> <20050610062431.GA78875@isis.sigpipe.cz> <86fyvq3c4o.fsf@xps.des.no> <20050610112857.GB80719@isis.sigpipe.cz> <86psuuv1z6.fsf@xps.des.no> <20050613090808.GB1789@isis.sigpipe.cz> Date: Mon, 20 Jun 2005 03:46:45 -0400 To: Roman Neuhauser , Dag-Erling Sm?rgrav From: Garance A Drosihn Content-Type: text/plain; charset="us-ascii" ; format="flowed" X-CanItPRO-Stream: default X-RPI-SA-Score: undef - spam-scanning disabled X-Scanned-By: CanIt (www . canit . ca) on 128.113.2.4 Cc: freebsd-ports@freebsd.org, freebsd-arch@freebsd.org Subject: Re: Bug in #! processing - "pear broken on current" X-BeenThere: freebsd-arch@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Discussion related to FreeBSD architecture List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 20 Jun 2005 07:46:50 -0000 At 11:08 AM +0200 6/13/05, Roman Neuhauser wrote: ># des@des.no / 2005-06-10 14:19:09 +0200: >> Roman Neuhauser writes: >> > That simply shows that all these *Linux* distros don't handle >> > shebang lines well. >> >> Actually, it shows that they handle shebang lines *correctly*, and >> that we don't unilaterally break Pear by aligning ourselves with them. > > These two were identical before: > > #!/usr/local/bin/php -n -q -dsafe_mode=0 -doutput_buffering=1 > % /usr/local/bin/php -n -q -dsafe_mode=0 -doutput_buffering=1 > > These two are identical now: > > #!/usr/local/bin/php -n -q -dsafe_mode=0 -doutput_buffering=1 > % /usr/local/bin/php "-n -q -dsafe_mode=0 -doutput_buffering=1" > > Obviously, "correct" is whatever behavior we declare as such. > But is the latter actually useful? The Linux distros you > shown hacking around the shebang parsing limitations (forking > another shell to achieve the correct parsing) shows just that: > Linux distros basically avoiding anything above the simplest > "#!/bin/sh". Note that there is a history behind all this, and it's due to that history that FreeBSD's previous behavior is wrong. And it is wrong because it meant that some scripts which used to work on FreeBSD cannot be made to work on other OS's, and it also meant that some scripts that work on other OS's could not be made to work under the previous behavior of FreeBSD's kernel. Believe me, I've wasted a lot more hours than I would care to count investigating this very topic in the last six months. If there was any way I could have justified keeping the previous FreeBSD behavior, I would have. I ended up breaking some of my *own* scripts when I made that change! But now that I've come up with these changes to `env', I'm kinda happy about how the whole thing turned out. Now if we could just convince other OS's to pick up those changes! They could do that without breaking any of their current scripts, too. -- Garance Alistair Drosehn = gad@gilead.netel.rpi.edu Senior Systems Programmer or gad@freebsd.org Rensselaer Polytechnic Institute or drosih@rpi.edu From owner-freebsd-arch@FreeBSD.ORG Mon Jun 20 17:51:40 2005 Return-Path: X-Original-To: arch@freebsd.org Delivered-To: freebsd-arch@FreeBSD.ORG Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id AD48816A41C for ; Mon, 20 Jun 2005 17:51:40 +0000 (GMT) (envelope-from imp@bsdimp.com) Received: from harmony.village.org (vc4-2-0-66.dsl.netrack.net [199.45.160.85]) by mx1.FreeBSD.org (Postfix) with ESMTP id 52D6843D58 for ; Mon, 20 Jun 2005 17:51:37 +0000 (GMT) (envelope-from imp@bsdimp.com) Received: from localhost (localhost.village.org [127.0.0.1]) by harmony.village.org (8.13.3/8.13.3) with ESMTP id j5KHot6N025857; Mon, 20 Jun 2005 11:50:59 -0600 (MDT) (envelope-from imp@bsdimp.com) Date: Mon, 20 Jun 2005 11:52:03 -0600 (MDT) Message-Id: <20050620.115203.17593220.imp@bsdimp.com> To: howardsue@gmail.com From: "M. Warner Losh" In-Reply-To: <1e89cd51050614053073cd94cd@mail.gmail.com> References: <36765.1118749442@critter.freebsd.dk> <1e89cd51050614050373dca5af@mail.gmail.com> <1e89cd51050614053073cd94cd@mail.gmail.com> X-Mailer: Mew version 3.3 on Emacs 21.3 / Mule 5.0 (SAKAKI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit Cc: arch@freebsd.org Subject: Re: [DCR] Remove devstat X-BeenThere: freebsd-arch@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Discussion related to FreeBSD architecture List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 20 Jun 2005 17:51:40 -0000 In message: <1e89cd51050614053073cd94cd@mail.gmail.com> Sue Howard writes: : Anyway, since devicestat is only used for collect statistics, I'd like : to remove the this type from the devstat. And we can implement this : type into devclass(device_t?? maybe). This is what I proposed. It will : bring some benifits like remove the long regex to match NIC interface : in devd.conf, etc. One can actually remove it already because the 'link up' messages from the network layer are sufficiently unique... Warner From owner-freebsd-arch@FreeBSD.ORG Tue Jun 21 03:03:57 2005 Return-Path: X-Original-To: freebsd-arch@FreeBSD.org Delivered-To: freebsd-arch@FreeBSD.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 807D516A41C for ; Tue, 21 Jun 2005 03:03:57 +0000 (GMT) (envelope-from sales@recoverit.co.nz) Received: from bo.nznet.gen.nz (bo.nznet.gen.nz [202.27.216.34]) by mx1.FreeBSD.org (Postfix) with ESMTP id 731DD43D1F for ; Tue, 21 Jun 2005 03:03:55 +0000 (GMT) (envelope-from sales@recoverit.co.nz) Received: from nznetsales (roscoe.nznet.gen.nz [202.27.216.38]) by bo.nznet.gen.nz (8.11.6/8.11.6) with ESMTP id j5L33m425805 for ; Tue, 21 Jun 2005 15:03:48 +1200 Message-Id: <200506210303.j5L33m425805@bo.nznet.gen.nz> From: "Peter Innes" To: Date: Tue, 21 Jun 2005 15:04:07 +1200 MIME-Version: 1.0 X-Mailer: Microsoft Office Outlook, Build 11.0.6353 X-MIMEOLE: Produced By Microsoft MimeOLE V6.00.2900.2180 Thread-Index: AcV2DeM9u3khjPWlSpKUnp55RiXKFA== Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit X-Content-Filtered-By: Mailman/MimeDel 2.1.5 Cc: Subject: RE: JRE 1.4 and freebsd X-BeenThere: freebsd-arch@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Discussion related to FreeBSD architecture List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 21 Jun 2005 03:03:57 -0000 Hi there Could you tell me if JRE 1.4 can be used with Freebsd? Regards Peter Innes RecoverIT Tel: +64 (0)9 914 0062 Cell: +64 (0)21 166 8804 Fax: +64 (0)9 914 0040 email: peter.innes@recoverit.co.nz Website: www.recoverit.co.nz RecoverIT provides end-to-end, disc-to-disc data backup and recovery services that protect the critical business information on servers including MS Exchange, SQL, and a wide range of UNIX platforms and PCs. Enabling operational recovery of business critical data. From owner-freebsd-arch@FreeBSD.ORG Tue Jun 21 19:48:09 2005 Return-Path: X-Original-To: freebsd-arch@freebsd.org Delivered-To: freebsd-arch@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 54B2816A41C for ; Tue, 21 Jun 2005 19:48:09 +0000 (GMT) (envelope-from ben@timing.com) Received: from Daffy.timing.com (smtp.timing.com [206.168.13.218]) by mx1.FreeBSD.org (Postfix) with ESMTP id E6BE943D5F for ; Tue, 21 Jun 2005 19:48:07 +0000 (GMT) (envelope-from ben@timing.com) Received: from piglet.timing.com (oink@piglet.timing.com [206.168.13.178]) by Daffy.timing.com (8.13.1/8.12.8) with ESMTP id j5LJm61r048992 for ; Tue, 21 Jun 2005 13:48:06 -0600 (MDT) (envelope-from ben@timing.com) Received: from piglet.timing.com (oink@localhost.timing.com [127.0.0.1]) by piglet.timing.com (8.12.6p3/8.12.6) with ESMTP id j5LJm6mE000862 for ; Tue, 21 Jun 2005 13:48:06 -0600 (MDT) (envelope-from ben@piglet.timing.com) Received: (from ben@localhost) by piglet.timing.com (8.12.6p3/8.12.6/Submit) id j5LJm60r000859; Tue, 21 Jun 2005 13:48:06 -0600 (MDT) Date: Tue, 21 Jun 2005 13:48:06 -0600 (MDT) Message-Id: <200506211948.j5LJm60r000859@piglet.timing.com> From: Ben Mesander To: freebsd-arch@freebsd.org X-Virus-Scanned: ClamAV version 0.84, clamav-milter version 0.84e on Daffy.timing.com X-Virus-Status: Clean Subject: sbin/md5 license problem X-BeenThere: freebsd-arch@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Discussion related to FreeBSD architecture List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 21 Jun 2005 19:48:09 -0000 All, I have been researching the license found on sbin/md5/md5.c . This file is the command-line wrapper for functionality found in libmd. >From the source code: /* * Copyright (C) 1990-2, RSA Data Security, Inc. Created 1990. All * rights reserved. * * RSA Data Security, Inc. makes no representations concerning either * the merchantability of this software or the suitability of this * software for any particular purpose. It is provided "as is" * without express or implied warranty of any kind. * * These notices must be retained in any copies of any part of this * documentation and/or software. */ This license does not seem to allow for redistribution or derivative works. I would think this would be a problem for FreeBSD. The CVS log for the initial commit to the FreeBSD vendor branch (can be viewed via: http://www.freebsd.org/cgi/cvsweb.cgi/src/sbin/md5/md5.c ) says: "Incorproate version of md5 placed into public domain by RSA." But the license text in this commit is identical to the above, and is clearly not public domain. It appears that the OpenBSD project at one point completely re-wrote the wrapper so as to have a BSD license (and make other improvements): http://www.openbsd.org/cgi-bin/cvsweb/src/bin/md5/md5.c.diff?r1=1.9&r2=1.10 I have not yet located where NetBSD hid their md5 source on their website. Regards, Ben From owner-freebsd-arch@FreeBSD.ORG Tue Jun 21 20:15:37 2005 Return-Path: X-Original-To: freebsd-arch@freebsd.org Delivered-To: freebsd-arch@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id A2C1016A41C for ; Tue, 21 Jun 2005 20:15:37 +0000 (GMT) (envelope-from sgk@troutmask.apl.washington.edu) Received: from troutmask.apl.washington.edu (troutmask.apl.washington.edu [128.208.78.105]) by mx1.FreeBSD.org (Postfix) with ESMTP id 6EA7D43D1F for ; Tue, 21 Jun 2005 20:15:37 +0000 (GMT) (envelope-from sgk@troutmask.apl.washington.edu) Received: from troutmask.apl.washington.edu (localhost [127.0.0.1]) by troutmask.apl.washington.edu (8.13.4/8.13.4) with ESMTP id j5LKFZMA062158; Tue, 21 Jun 2005 13:15:35 -0700 (PDT) (envelope-from sgk@troutmask.apl.washington.edu) Received: (from sgk@localhost) by troutmask.apl.washington.edu (8.13.4/8.13.1/Submit) id j5LKFZw4062157; Tue, 21 Jun 2005 13:15:35 -0700 (PDT) (envelope-from sgk) Date: Tue, 21 Jun 2005 13:15:35 -0700 From: Steve Kargl To: Ben Mesander Message-ID: <20050621201534.GA62124@troutmask.apl.washington.edu> References: <200506211948.j5LJm60r000859@piglet.timing.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <200506211948.j5LJm60r000859@piglet.timing.com> User-Agent: Mutt/1.4.2.1i Cc: freebsd-arch@freebsd.org Subject: Re: sbin/md5 license problem X-BeenThere: freebsd-arch@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Discussion related to FreeBSD architecture List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 21 Jun 2005 20:15:37 -0000 On Tue, Jun 21, 2005 at 01:48:06PM -0600, Ben Mesander wrote: > All, > > I have been researching the license found on sbin/md5/md5.c . This > file is the command-line wrapper for functionality found in libmd. > http://www.faqs.org/rfcs/rfc1321 -- Steve From owner-freebsd-arch@FreeBSD.ORG Tue Jun 21 20:32:00 2005 Return-Path: X-Original-To: freebsd-arch@freebsd.org Delivered-To: freebsd-arch@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 665F216A41C for ; Tue, 21 Jun 2005 20:32:00 +0000 (GMT) (envelope-from ben@timing.com) Received: from Daffy.timing.com (ns2.timing.com [206.168.13.218]) by mx1.FreeBSD.org (Postfix) with ESMTP id DA9C343D49 for ; Tue, 21 Jun 2005 20:31:58 +0000 (GMT) (envelope-from ben@timing.com) Received: from piglet.timing.com (oink@piglet.timing.com [206.168.13.178]) by Daffy.timing.com (8.13.1/8.12.8) with ESMTP id j5LKVwF1053539; Tue, 21 Jun 2005 14:31:58 -0600 (MDT) (envelope-from ben@timing.com) Received: from piglet.timing.com (oink@localhost.timing.com [127.0.0.1]) by piglet.timing.com (8.12.6p3/8.12.6) with ESMTP id j5LKVwmE000998; Tue, 21 Jun 2005 14:31:58 -0600 (MDT) (envelope-from ben@piglet.timing.com) Received: (from ben@localhost) by piglet.timing.com (8.12.6p3/8.12.6/Submit) id j5LKVvgO000995; Tue, 21 Jun 2005 14:31:57 -0600 (MDT) From: Ben Mesander MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Message-ID: <17080.31037.712973.14505@piglet.timing.com> Date: Tue, 21 Jun 2005 14:31:57 -0600 To: Steve Kargl In-Reply-To: <20050621201534.GA62124@troutmask.apl.washington.edu> References: <200506211948.j5LJm60r000859@piglet.timing.com> <20050621201534.GA62124@troutmask.apl.washington.edu> X-Mailer: VM 7.00 under Emacs 21.2.95.2 X-Virus-Scanned: ClamAV version 0.84, clamav-milter version 0.84e on Daffy.timing.com X-Virus-Status: Clean Cc: freebsd-arch@freebsd.org Subject: Re: sbin/md5 license problem X-BeenThere: freebsd-arch@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Discussion related to FreeBSD architecture List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 21 Jun 2005 20:32:00 -0000 Steve Kargl writes: > http://www.faqs.org/rfcs/rfc1321 Thanks. This confirms the original copyright from RSA (on mddriver.c, which became md5.c in the FreeBSD source tree). While other files in the package explicitly allow redistribution and derivative works, this one does not. Regards, Ben From owner-freebsd-arch@FreeBSD.ORG Tue Jun 21 21:18:26 2005 Return-Path: X-Original-To: freebsd-arch@freebsd.org Delivered-To: freebsd-arch@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 7468716A41C for ; Tue, 21 Jun 2005 21:18:26 +0000 (GMT) (envelope-from phk@critter.freebsd.dk) Received: from pasmtp.tele.dk (pasmtp.tele.dk [193.162.159.95]) by mx1.FreeBSD.org (Postfix) with ESMTP id 3AB0B43D1F for ; Tue, 21 Jun 2005 21:18:26 +0000 (GMT) (envelope-from phk@critter.freebsd.dk) Received: from critter.freebsd.dk (0x535c0e2a.sgnxx1.adsl-dhcp.tele.dk [83.92.14.42]) by pasmtp.tele.dk (Postfix) with ESMTP id 832EF1EC327 for ; Tue, 21 Jun 2005 23:18:25 +0200 (CEST) Received: from critter.freebsd.dk (localhost [127.0.0.1]) by critter.freebsd.dk (8.13.4/8.13.3) with ESMTP id j5LLIJeT080260; Tue, 21 Jun 2005 23:18:20 +0200 (CEST) (envelope-from phk@critter.freebsd.dk) To: Ben Mesander From: "Poul-Henning Kamp" In-Reply-To: Your message of "Tue, 21 Jun 2005 13:48:06 MDT." <200506211948.j5LJm60r000859@piglet.timing.com> Date: Tue, 21 Jun 2005 23:18:19 +0200 Message-ID: <80259.1119388699@critter.freebsd.dk> Sender: phk@critter.freebsd.dk Cc: freebsd-arch@freebsd.org Subject: Re: sbin/md5 license problem X-BeenThere: freebsd-arch@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Discussion related to FreeBSD architecture List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 21 Jun 2005 21:18:26 -0000 In message <200506211948.j5LJm60r000859@piglet.timing.com>, Ben Mesander writes : >All, > > I have been researching the license found on sbin/md5/md5.c . This >file is the command-line wrapper for functionality found in libmd. >The CVS log for the initial commit to the FreeBSD vendor branch (can >be viewed via: >http://www.freebsd.org/cgi/cvsweb.cgi/src/sbin/md5/md5.c ) says: > >"Incorproate version of md5 placed into public domain by RSA." > >But the license text in this commit is identical to the above, and >is clearly not public domain. I retained the exact source file to avoid any risk of introducing bugs. -- Poul-Henning Kamp | UNIX since Zilog Zeus 3.20 phk@FreeBSD.ORG | TCP/IP since RFC 956 FreeBSD committer | BSD since 4.3-tahoe Never attribute to malice what can adequately be explained by incompetence. From owner-freebsd-arch@FreeBSD.ORG Thu Jun 23 06:23:29 2005 Return-Path: X-Original-To: arch@freebsd.org Delivered-To: freebsd-arch@FreeBSD.ORG Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id C7F1616A421; Thu, 23 Jun 2005 06:23:29 +0000 (GMT) (envelope-from peter@wemm.org) Received: from canning.wemm.org (canning.wemm.org [192.203.228.65]) by mx1.FreeBSD.org (Postfix) with ESMTP id A32CD43D1F; Thu, 23 Jun 2005 06:23:29 +0000 (GMT) (envelope-from peter@wemm.org) Received: from fw.wemm.org (canning.wemm.org [192.203.228.65]) by canning.wemm.org (Postfix) with ESMTP id 4C7C32A8FA; Wed, 22 Jun 2005 23:23:29 -0700 (PDT) (envelope-from peter@wemm.org) Received: from overcee.wemm.org (overcee.wemm.org [10.0.0.3]) by fw.wemm.org (Postfix) with ESMTP id C554FE2B3; Wed, 22 Jun 2005 23:23:28 -0700 (PDT) (envelope-from peter@wemm.org) Received: from overcee.wemm.org (localhost [127.0.0.1]) by overcee.wemm.org (8.13.3/8.13.1) with ESMTP id j5N6NRuT029395; Wed, 22 Jun 2005 23:23:27 -0700 (PDT) (envelope-from peter@wemm.org) Received: from localhost (localhost [[UNIX: localhost]]) by overcee.wemm.org (8.13.3/8.13.1/Submit) id j5N6NQ1N029394; Wed, 22 Jun 2005 23:23:26 -0700 (PDT) (envelope-from peter@wemm.org) X-Authentication-Warning: overcee.wemm.org: peter set sender to peter@wemm.org using -f From: Peter Wemm To: freebsd-arch@freebsd.org, Sue Howard Date: Wed, 22 Jun 2005 23:23:25 -0700 User-Agent: KMail/1.8 References: <1e89cd51050616062241e9e201@mail.gmail.com> In-Reply-To: <1e89cd51050616062241e9e201@mail.gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Content-Disposition: inline Message-Id: <200506222323.26666.peter@wemm.org> Cc: arch@freebsd.org Subject: Re: Kernel Dump X-BeenThere: freebsd-arch@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Discussion related to FreeBSD architecture List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 23 Jun 2005 06:23:30 -0000 On Thursday 16 June 2005 06:22 am, Sue Howard wrote: > Hi, > > I find there are three states of kernel dump support currently. > 1. ARM and PowerPC. > Not supported yet. > 2. I386, AMD64, Alpha. > The dump file contains dump header plus the raw physical memory > image. The code in dump_machdep.c is almost same. > 3. IA64, SPARC > The dump file has private header besides dump header and raw physical > memory image. The code is ready for importing a MI dump interface. > > I want to understand what IA64 and SPARC are different than i386. > What is the private header is for? Is it tech problem or historic > problem? Is it possible to remove the private header in order to make > IA64 and SPARC share the dump code of i386? The private header is to standardize the way savecore(8) finds the dump images and recovers them. IA64 and Sparc systems usually had sparse memory configurations and the old raw format didn't have any facility to avoid storing holes. Suppose you had a machine where 1GB of ram appeared at physical adress 0, and the other 1GB of ram appeared at physical address 7GB. The i386 and alpha dump method would require 8GB of dump file and swap device usage to record those 2 x 1GB chunks of data. IA64 uses an ELF "coredump" format to record the memory segments that are scattered around its address space. It is flexible and descriptive enough to handle this. sparc64 uses its own custom format to achieve the same thing. I've just rewritten the AMD64 crashdump support to use ELF like ia64. In fact, I reused most of the ia64 code. We ran into serious problems at work, first on the amd64 platform and now also the i386 platform. The problem is that x86 machines are increasinly having memory holes. The simplistic dump code has no way to skip the memory hole and tries to dump things like the AGP frame buffer, pci card MMIO space, PCI-Express configuration space (this means accessing hardware!!) and so on. We have already switched to ELF crashdump support at work (yahoo) on amd64 and will be backporting to i386 and even RELENG_4 (PAE systems expose the same problem on this hardware). doghouse# file /var/crash/vmcore.1 /var/crash/vmcore.1: ELF 64-bit LSB core file AMD x86-64, invalid version (embedded) doghouse# objdump --headers /var/crash/vmcore.1 Sections: Idx Name Size VMA LMA File off Algn 0 load0 000a0000 0000000000 0000000000 00001000 2**12 CONTENTS, ALLOC, LOAD, READONLY 1 load1 7c1c0000 0000100000 0000100000 000a1000 2**12 CONTENTS, ALLOC, LOAD, READONLY 2 load2 00100000 007ff00000 007ff00000 7c261000 2**12 CONTENTS, ALLOC, LOAD, READONLY It doesn't mean much, but at least the standard tools let you see inside the crash dump. libkvm and gdb support is trivial. Anyway, this isn't a new problem for i386 either. I have one older machine in a server room that has 6GB of ram. 2GB at address 0-2GB, a 2GB pci hotplug hole, and 4GB at 4-8GB. This 5 year old machine does nasty things if you crash it with dumps enabled. BTW: elf core dumps are really simple. They're two headers (elf and program headers) and then the memory contents. There isn't much to it. > In my understanding, it should be possible. Since /dev/mem should be > a physic memory image. Anyway, if anything, the i386 code is going away. Machines with sparse memory are becoming more common. > Howard -- Peter Wemm - peter@wemm.org; peter@FreeBSD.org; peter@yahoo-inc.com "All of this is for nothing if we don't go to the stars" - JMS/B5 From owner-freebsd-arch@FreeBSD.ORG Thu Jun 23 06:23:29 2005 Return-Path: X-Original-To: freebsd-arch@freebsd.org Delivered-To: freebsd-arch@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id C7F1616A421; Thu, 23 Jun 2005 06:23:29 +0000 (GMT) (envelope-from peter@wemm.org) Received: from canning.wemm.org (canning.wemm.org [192.203.228.65]) by mx1.FreeBSD.org (Postfix) with ESMTP id A32CD43D1F; Thu, 23 Jun 2005 06:23:29 +0000 (GMT) (envelope-from peter@wemm.org) Received: from fw.wemm.org (canning.wemm.org [192.203.228.65]) by canning.wemm.org (Postfix) with ESMTP id 4C7C32A8FA; Wed, 22 Jun 2005 23:23:29 -0700 (PDT) (envelope-from peter@wemm.org) Received: from overcee.wemm.org (overcee.wemm.org [10.0.0.3]) by fw.wemm.org (Postfix) with ESMTP id C554FE2B3; Wed, 22 Jun 2005 23:23:28 -0700 (PDT) (envelope-from peter@wemm.org) Received: from overcee.wemm.org (localhost [127.0.0.1]) by overcee.wemm.org (8.13.3/8.13.1) with ESMTP id j5N6NRuT029395; Wed, 22 Jun 2005 23:23:27 -0700 (PDT) (envelope-from peter@wemm.org) Received: from localhost (localhost [[UNIX: localhost]]) by overcee.wemm.org (8.13.3/8.13.1/Submit) id j5N6NQ1N029394; Wed, 22 Jun 2005 23:23:26 -0700 (PDT) (envelope-from peter@wemm.org) X-Authentication-Warning: overcee.wemm.org: peter set sender to peter@wemm.org using -f From: Peter Wemm To: freebsd-arch@freebsd.org, Sue Howard Date: Wed, 22 Jun 2005 23:23:25 -0700 User-Agent: KMail/1.8 References: <1e89cd51050616062241e9e201@mail.gmail.com> In-Reply-To: <1e89cd51050616062241e9e201@mail.gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Content-Disposition: inline Message-Id: <200506222323.26666.peter@wemm.org> Cc: arch@freebsd.org Subject: Re: Kernel Dump X-BeenThere: freebsd-arch@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Discussion related to FreeBSD architecture List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 23 Jun 2005 06:23:30 -0000 On Thursday 16 June 2005 06:22 am, Sue Howard wrote: > Hi, > > I find there are three states of kernel dump support currently. > 1. ARM and PowerPC. > Not supported yet. > 2. I386, AMD64, Alpha. > The dump file contains dump header plus the raw physical memory > image. The code in dump_machdep.c is almost same. > 3. IA64, SPARC > The dump file has private header besides dump header and raw physical > memory image. The code is ready for importing a MI dump interface. > > I want to understand what IA64 and SPARC are different than i386. > What is the private header is for? Is it tech problem or historic > problem? Is it possible to remove the private header in order to make > IA64 and SPARC share the dump code of i386? The private header is to standardize the way savecore(8) finds the dump images and recovers them. IA64 and Sparc systems usually had sparse memory configurations and the old raw format didn't have any facility to avoid storing holes. Suppose you had a machine where 1GB of ram appeared at physical adress 0, and the other 1GB of ram appeared at physical address 7GB. The i386 and alpha dump method would require 8GB of dump file and swap device usage to record those 2 x 1GB chunks of data. IA64 uses an ELF "coredump" format to record the memory segments that are scattered around its address space. It is flexible and descriptive enough to handle this. sparc64 uses its own custom format to achieve the same thing. I've just rewritten the AMD64 crashdump support to use ELF like ia64. In fact, I reused most of the ia64 code. We ran into serious problems at work, first on the amd64 platform and now also the i386 platform. The problem is that x86 machines are increasinly having memory holes. The simplistic dump code has no way to skip the memory hole and tries to dump things like the AGP frame buffer, pci card MMIO space, PCI-Express configuration space (this means accessing hardware!!) and so on. We have already switched to ELF crashdump support at work (yahoo) on amd64 and will be backporting to i386 and even RELENG_4 (PAE systems expose the same problem on this hardware). doghouse# file /var/crash/vmcore.1 /var/crash/vmcore.1: ELF 64-bit LSB core file AMD x86-64, invalid version (embedded) doghouse# objdump --headers /var/crash/vmcore.1 Sections: Idx Name Size VMA LMA File off Algn 0 load0 000a0000 0000000000 0000000000 00001000 2**12 CONTENTS, ALLOC, LOAD, READONLY 1 load1 7c1c0000 0000100000 0000100000 000a1000 2**12 CONTENTS, ALLOC, LOAD, READONLY 2 load2 00100000 007ff00000 007ff00000 7c261000 2**12 CONTENTS, ALLOC, LOAD, READONLY It doesn't mean much, but at least the standard tools let you see inside the crash dump. libkvm and gdb support is trivial. Anyway, this isn't a new problem for i386 either. I have one older machine in a server room that has 6GB of ram. 2GB at address 0-2GB, a 2GB pci hotplug hole, and 4GB at 4-8GB. This 5 year old machine does nasty things if you crash it with dumps enabled. BTW: elf core dumps are really simple. They're two headers (elf and program headers) and then the memory contents. There isn't much to it. > In my understanding, it should be possible. Since /dev/mem should be > a physic memory image. Anyway, if anything, the i386 code is going away. Machines with sparse memory are becoming more common. > Howard -- Peter Wemm - peter@wemm.org; peter@FreeBSD.org; peter@yahoo-inc.com "All of this is for nothing if we don't go to the stars" - JMS/B5 From owner-freebsd-arch@FreeBSD.ORG Thu Jun 23 07:49:20 2005 Return-Path: X-Original-To: freebsd-arch@freebsd.org Delivered-To: freebsd-arch@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id B3E4016A41C; Thu, 23 Jun 2005 07:49:20 +0000 (GMT) (envelope-from wilkinsa@squash.dsto.defence.gov.au) Received: from digger1.defence.gov.au (digger1.defence.gov.au [203.5.217.4]) by mx1.FreeBSD.org (Postfix) with ESMTP id 31DD243D4C; Thu, 23 Jun 2005 07:49:19 +0000 (GMT) (envelope-from wilkinsa@squash.dsto.defence.gov.au) Received: from ednmsw501.dsto.defence.gov.au (ednmsw501.dsto.defence.gov.au [131.185.2.150]) by digger1.defence.gov.au with ESMTP id j5N7lYqQ024956; Thu, 23 Jun 2005 17:17:34 +0930 (CST) Received: from muttley.dsto.defence.gov.au (unverified) by ednmsw501.dsto.defence.gov.au (Content Technologies SMTPRS 4.3.17) with ESMTP id ; Thu, 23 Jun 2005 17:19:12 +0930 Received: from ednex501.dsto.defence.gov.au (ednex501.dsto.defence.gov.au [131.185.2.81]) by muttley.dsto.defence.gov.au (8.11.3/8.11.3) with ESMTP id j5N7ik012104; Thu, 23 Jun 2005 17:14:46 +0930 (CST) Received: from squash.dsto.defence.gov.au ([131.185.40.212]) by ednex501.dsto.defence.gov.au with SMTP (Microsoft Exchange Internet Mail Service Version 5.5.2653.13) id MR6XD6KQ; Thu, 23 Jun 2005 17:14:32 +0930 Received: from squash.dsto.defence.gov.au (localhost [127.0.0.1]) by squash.dsto.defence.gov.au (8.13.3/8.13.3) with ESMTP id j5N7itQl071790; Thu, 23 Jun 2005 17:14:55 +0930 (CST) (envelope-from wilkinsa@squash.dsto.defence.gov.au) Received: (from root@localhost) by squash.dsto.defence.gov.au (8.13.3/8.13.3/Submit) id j5N7irDS071789; Thu, 23 Jun 2005 17:14:54 +0930 (CST) (envelope-from wilkinsa) Date: Thu, 23 Jun 2005 17:14:53 +0930 From: "Wilkinson, Alex" To: Peter Wemm Message-ID: <20050623074453.GA71779@squash.dsto.defence.gov.au> Mail-Followup-To: Peter Wemm , freebsd-arch@freebsd.org, Sue Howard , arch@freebsd.org References: <1e89cd51050616062241e9e201@mail.gmail.com> <200506222323.26666.peter@wemm.org> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Disposition: inline In-Reply-To: <200506222323.26666.peter@wemm.org> User-Agent: Mutt/1.5.9i Cc: arch@freebsd.org, Sue Howard , freebsd-arch@freebsd.org Subject: Re: Kernel Dump X-BeenThere: freebsd-arch@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Discussion related to FreeBSD architecture List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 23 Jun 2005 07:49:20 -0000 0n Wed, Jun 22, 2005 at 11:23:25PM -0700, Peter Wemm wrote: >I've just rewritten the AMD64 crashdump support to use ELF like ia64. >In fact, I reused most of the ia64 code. We ran into serious problems >at work, first on the amd64 platform and now also the i386 platform. >The problem is that x86 machines are increasinly having memory holes. >The simplistic dump code has no way to skip the memory hole and tries >to dump things like the AGP frame buffer, pci card MMIO space, >PCI-Express configuration space (this means accessing hardware!!) and >so on. Curious, why is it that x86 creates memory holes in the first place ? - aW From owner-freebsd-arch@FreeBSD.ORG Thu Jun 23 07:49:20 2005 Return-Path: X-Original-To: arch@freebsd.org Delivered-To: freebsd-arch@FreeBSD.ORG Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id B3E4016A41C; Thu, 23 Jun 2005 07:49:20 +0000 (GMT) (envelope-from wilkinsa@squash.dsto.defence.gov.au) Received: from digger1.defence.gov.au (digger1.defence.gov.au [203.5.217.4]) by mx1.FreeBSD.org (Postfix) with ESMTP id 31DD243D4C; Thu, 23 Jun 2005 07:49:19 +0000 (GMT) (envelope-from wilkinsa@squash.dsto.defence.gov.au) Received: from ednmsw501.dsto.defence.gov.au (ednmsw501.dsto.defence.gov.au [131.185.2.150]) by digger1.defence.gov.au with ESMTP id j5N7lYqQ024956; Thu, 23 Jun 2005 17:17:34 +0930 (CST) Received: from muttley.dsto.defence.gov.au (unverified) by ednmsw501.dsto.defence.gov.au (Content Technologies SMTPRS 4.3.17) with ESMTP id ; Thu, 23 Jun 2005 17:19:12 +0930 Received: from ednex501.dsto.defence.gov.au (ednex501.dsto.defence.gov.au [131.185.2.81]) by muttley.dsto.defence.gov.au (8.11.3/8.11.3) with ESMTP id j5N7ik012104; Thu, 23 Jun 2005 17:14:46 +0930 (CST) Received: from squash.dsto.defence.gov.au ([131.185.40.212]) by ednex501.dsto.defence.gov.au with SMTP (Microsoft Exchange Internet Mail Service Version 5.5.2653.13) id MR6XD6KQ; Thu, 23 Jun 2005 17:14:32 +0930 Received: from squash.dsto.defence.gov.au (localhost [127.0.0.1]) by squash.dsto.defence.gov.au (8.13.3/8.13.3) with ESMTP id j5N7itQl071790; Thu, 23 Jun 2005 17:14:55 +0930 (CST) (envelope-from wilkinsa@squash.dsto.defence.gov.au) Received: (from root@localhost) by squash.dsto.defence.gov.au (8.13.3/8.13.3/Submit) id j5N7irDS071789; Thu, 23 Jun 2005 17:14:54 +0930 (CST) (envelope-from wilkinsa) Date: Thu, 23 Jun 2005 17:14:53 +0930 From: "Wilkinson, Alex" To: Peter Wemm Message-ID: <20050623074453.GA71779@squash.dsto.defence.gov.au> Mail-Followup-To: Peter Wemm , freebsd-arch@freebsd.org, Sue Howard , arch@freebsd.org References: <1e89cd51050616062241e9e201@mail.gmail.com> <200506222323.26666.peter@wemm.org> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Disposition: inline In-Reply-To: <200506222323.26666.peter@wemm.org> User-Agent: Mutt/1.5.9i Cc: arch@freebsd.org, Sue Howard , freebsd-arch@freebsd.org Subject: Re: Kernel Dump X-BeenThere: freebsd-arch@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Discussion related to FreeBSD architecture List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 23 Jun 2005 07:49:20 -0000 0n Wed, Jun 22, 2005 at 11:23:25PM -0700, Peter Wemm wrote: >I've just rewritten the AMD64 crashdump support to use ELF like ia64. >In fact, I reused most of the ia64 code. We ran into serious problems >at work, first on the amd64 platform and now also the i386 platform. >The problem is that x86 machines are increasinly having memory holes. >The simplistic dump code has no way to skip the memory hole and tries >to dump things like the AGP frame buffer, pci card MMIO space, >PCI-Express configuration space (this means accessing hardware!!) and >so on. Curious, why is it that x86 creates memory holes in the first place ? - aW From owner-freebsd-arch@FreeBSD.ORG Thu Jun 23 10:20:51 2005 Return-Path: X-Original-To: freebsd-arch@FreeBSD.org Delivered-To: freebsd-arch@FreeBSD.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 9E85816A41C for ; Thu, 23 Jun 2005 10:20:51 +0000 (GMT) (envelope-from delphij@frontfree.net) Received: from tarsier.geekcn.org (tarsier.geekcn.org [210.51.165.229]) by mx1.FreeBSD.org (Postfix) with ESMTP id B9C8F43D1F for ; Thu, 23 Jun 2005 10:20:49 +0000 (GMT) (envelope-from delphij@frontfree.net) Received: from beastie.frontfree.net (unknown [219.239.99.7]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by tarsier.geekcn.org (Postfix) with ESMTP id 49A66EB0A21 for ; Thu, 23 Jun 2005 18:20:44 +0800 (CST) Received: from localhost (localhost.frontfree.net [127.0.0.1]) by beastie.frontfree.net (Postfix) with ESMTP id B8A901329F7; Thu, 23 Jun 2005 18:20:37 +0800 (CST) Received: from beastie.frontfree.net ([127.0.0.1]) by localhost (beastie.frontfree.net [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 88898-20; Thu, 23 Jun 2005 18:20:30 +0800 (CST) Received: by beastie.frontfree.net (Postfix, from userid 1001) id 9CF7B1327C3; Thu, 23 Jun 2005 18:20:24 +0800 (CST) Date: Thu, 23 Jun 2005 18:20:24 +0800 From: Xin LI To: freebsd-arch@FreeBSD.org Message-ID: <20050623102024.GA89874@frontfree.net> Mime-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="9zSXsLTf0vkW971A" Content-Disposition: inline User-Agent: Mutt/1.4.2.1i X-GPG-key-ID/Fingerprint: 0xCAEEB8C0 / 43B8 B703 B8DD 0231 B333 DC28 39FB 93A0 CAEE B8C0 X-GPG-Public-Key: http://www.delphij.net/delphij.asc X-Operating-System: FreeBSD beastie.frontfree.net 5.4-RELEASE-p1 FreeBSD 5.4-RELEASE-p1 #1: Fri May 27 00:47:15 CST 2005 delphij@beastie.frontfree.net:/usr/obj/usr/src/sys/BEASTIE i386 X-URL: http://www.delphij.net X-By: delphij@beastie.frontfree.net X-Location: Beijing, China X-Virus-Scanned: amavisd-new at frontfree.net Cc: howardsue@gmail.com Subject: How to get stack from every thread when doing crash dump? X-BeenThere: freebsd-arch@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Discussion related to FreeBSD architecture List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 23 Jun 2005 10:20:51 -0000 --9zSXsLTf0vkW971A Content-Type: multipart/mixed; boundary="oyUTqETQ0mS9luUI" Content-Disposition: inline --oyUTqETQ0mS9luUI Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Dear folks, Recently I was working with a friend to figure out whether we can do more on our crashdump mechanism, as dumping the whole core memory is a painful process when you have some gigabytes of RAM. Finally, we have implemented an experimental mini-dump on our local development tree, and adopted some IA64 MD dump code to provide a MI interface to handle dumping. A proof-of- concept patchset is included (see below). As a side note,=20 One problem with the mini-dump is that, since the mini-dump utilizes: dump_write((char *)curthread->td_kstack, curthread->td_kstack_pages * PAGE= _SIZE); To write out the stack, and at the point before exception.S, curthread has been changed, we can only obtain the stack from the current thread, which may not be enough for analyzing the backtrace. What can we do to improve this situation? Thanks in advance! -------------------------------------------------------------------------- BTW: A proof-of-concept patchset is in the attachment, which implements mini-dump, and adopted the MD code from IA64 dump by turning them to MI interfaces. At this time, the idea that peter@ has commented this morning has not implemented (yet), and we need to do more style cleanups on the code. The patchset is HIGHLY EXPERIMENTAL so be warned that there is glitches, and may boom your box :-) In order to use it, you need to patch your source tree with the patchset, and rebuild the kernel as well as savecore(8) and kgdb related stuff, a full make world/kernel procedure is recommended. To use minidump you need to specify "-t 1" to kgdb. ------------------------------------------------------------------------- Cheers, --=20 Xin LI http://www.delphij.net/ See complete headers for GPG key and other information. --oyUTqETQ0mS9luUI Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=patchset-howard-minidump Content-Transfer-Encoding: quoted-printable Index: src/gnu/usr.bin/gdb/kgdb/Makefile diff -u src/gnu/usr.bin/gdb/kgdb/Makefile:1.6 src/gnu/usr.bin/gdb/kgdb/Make= file:1.6.1000.1 --- src/gnu/usr.bin/gdb/kgdb/Makefile:1.6 Mon Feb 21 07:06:03 2005 +++ src/gnu/usr.bin/gdb/kgdb/Makefile Mon Jun 13 00:50:55 2005 @@ -1,9 +1,11 @@ # $FreeBSD$ =20 PROG=3D kgdb${GDB_SUFFIX} -SRCS=3D main.c kthr.c trgt.c trgt_${TARGET_ARCH}.c +SRCS=3D main.c kthr.c trgt.c mini_trgt.c full_trgt.c trgt_${TARGET_ARCH}.c WARNS?=3D 2 =20 +CFLAGS+=3D-I${.CURDIR}/../../../../sys + BULIBS=3D ${OBJ_BU}/libbfd/libbfd.a ${OBJ_BU}/libopcodes/libopcodes.a \ ${OBJ_BU}/libiberty/libiberty.a GDBLIBS=3D ${OBJ_GDB}/libgdb/libgdb.a Index: src/gnu/usr.bin/gdb/kgdb/full_trgt.c diff -u /dev/null src/gnu/usr.bin/gdb/kgdb/full_trgt.c:1.1.1000.1 --- /dev/null Thu Jun 23 18:02:17 2005 +++ src/gnu/usr.bin/gdb/kgdb/full_trgt.c Mon Jun 13 00:50:55 2005 @@ -0,0 +1,114 @@ +/* + * Copyright (c) 2004 Marcel Moolenaar + * 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 WARRANTI= ES + * 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 US= E, + * 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: src/gnu/usr.bin/gdb/kgdb/trgt.c,v 1.1 2004/07/25 05:29= :15 marcel Exp $"); + +#include +#include +#include +#include +#include +#include +#include "kgdb.h" + +#include +#include +#include +#include +#include + +static kvm_t *kvm; + +static int +kgdb_trgt_xfer_memory_full(CORE_ADDR memaddr, char *myaddr, int len, int w= rite, + struct mem_attrib *attrib __unused, struct target_ops *target __unus= ed) +{ + int result; + if (len =3D=3D 0) + return (0); + + if (!write) + result =3D kvm_read(kvm, memaddr, myaddr, len); + else + result =3D kvm_write(kvm, memaddr, myaddr, len); + if (result !=3D len) + warnx("kvm_read/kvm_write: %s", kvm_geterr(kvm)); + return result; +} + +void trgt_provide_registers(struct pcb*); + +static void +kgdb_trgt_fetch_registers_full(int regno __unused) +{ + struct kthr *kt; + struct pcb pcb; + + kt =3D kgdb_thr_lookup_tid(ptid_get_tid(inferior_ptid)); + if (kt =3D=3D NULL) + return; + if (core_read(kt->pcb, &pcb, sizeof(pcb)) !=3D sizeof(pcb)) { + memset(&pcb, 0, sizeof(pcb)); + } + trgt_provide_registers(&pcb); +} + +static void +full_kldstat_cmd (char *args, int from_tty) +{ + int verbose =3D 0; + char** arg; + arg =3D buildargv(args); + if (arg !=3D NULL) { + if (strcmp(arg[0], "-v")) verbose =3D 1; + } +=09 + uintptr_t addr =3D core_lookup("linkerfile"); + if (addr !=3D 0) { + ui_out_text(uiout, "OK"); + } + ui_out_text(uiout, "\n"); +} + +void kgdb_trgt_init_full(struct target_ops* kgdb_trgt_ops, char* kernel, c= har* vmcore) +{ + char *s; + + add_cmd("kld", class_info, + full_kldstat_cmd,=20 + "Lists the modules that were loaded when the kernel crashed.", &cmdlist); + kgdb_trgt_ops->to_xfer_memory =3D kgdb_trgt_xfer_memory_full; + kgdb_trgt_ops->to_fetch_registers =3D kgdb_trgt_fetch_registers_full; + + s =3D malloc(_POSIX2_LINE_MAX); + kvm =3D kvm_openfiles(kernel, vmcore, NULL, O_RDONLY, s); + if (kvm =3D=3D NULL) + errx(1, s); + free(s); +=09 + kgdb_thr_init(); +} Index: src/gnu/usr.bin/gdb/kgdb/kgdb.h diff -u src/gnu/usr.bin/gdb/kgdb/kgdb.h:1.2 src/gnu/usr.bin/gdb/kgdb/kgdb.h= :1.2.1000.1 --- src/gnu/usr.bin/gdb/kgdb/kgdb.h:1.2 Mon Feb 21 06:55:07 2005 +++ src/gnu/usr.bin/gdb/kgdb/kgdb.h Mon Jun 13 00:50:55 2005 @@ -28,10 +28,10 @@ =20 #ifndef _KGDB_H_ #define _KGDB_H_ +#include =20 struct thread_info; =20 -extern kvm_t *kvm; extern int verbose; =20 struct kthr { @@ -46,9 +46,10 @@ =20 extern struct kthr *curkthr; =20 -void kgdb_target(void); -void kgdb_trgt_fetch_registers(int); -void kgdb_trgt_store_registers(int); +void kgdb_target(char* kernel, char* vmcore, dumpcoretype type); +int core_read(uintptr_t addr, void* myaddr, int size); +int core_write(uintptr_t addr, void* myaddr, int size); +uintptr_t core_lookup(const char *sym); =20 struct kthr *kgdb_thr_first(void); struct kthr *kgdb_thr_init(void); @@ -60,4 +61,9 @@ struct kthr *kgdb_thr_select(struct kthr *); char *kgdb_thr_extra_thread_info(int); =20 +struct target_ops; + +void kgdb_trgt_init_full(struct target_ops* kgdb_trgt_ops, char* kernel, c= har* vmcore); +void kgdb_trgt_init_mini(struct target_ops* kgdb_trgt_ops, char* kernel, c= har* vmcore); + #endif /* _KGDB_H_ */ Index: src/gnu/usr.bin/gdb/kgdb/kthr.c diff -u src/gnu/usr.bin/gdb/kgdb/kthr.c:1.2 src/gnu/usr.bin/gdb/kgdb/kthr.c= :1.2.1000.1 --- src/gnu/usr.bin/gdb/kgdb/kthr.c:1.2 Mon Feb 21 06:55:07 2005 +++ src/gnu/usr.bin/gdb/kgdb/kthr.c Mon Jun 13 00:50:55 2005 @@ -33,7 +33,6 @@ #include #include #include -#include #include #include =20 @@ -47,24 +46,27 @@ static struct kthr *first; struct kthr *curkthr; =20 -static uintptr_t -lookup(const char *sym) +struct kthr * +kgdb_thr_first(void) { - struct nlist nl[2]; - - nl[0].n_name =3D (char *)(uintptr_t)sym; - nl[1].n_name =3D NULL; - if (kvm_nlist(kvm, nl) !=3D 0) { - warnx("kvm_nlist(%s): %s", sym, kvm_geterr(kvm)); - return (0); - } - return (nl[0].n_value); + return (first); } =20 struct kthr * -kgdb_thr_first(void) +kgdb_thr_init_direct(struct pcb *dumppcb, struct thread *pcb, int tid) { - return (first); + struct kthr *kt; + dumptid =3D tid; +=09 + kt =3D malloc(sizeof(*kt)); + kt->next =3D NULL; + kt->kaddr =3D 0; + kt->pcb =3D 0; // dumppcb; + kt->kstack =3D pcb->td_kstack; + kt->tid =3D tid; + + curkthr =3D kt; + return kt; } =20 struct kthr * @@ -75,28 +77,26 @@ struct kthr *kt; uintptr_t addr, paddr; =20 - addr =3D lookup("_allproc"); + addr =3D core_lookup("_allproc"); if (addr =3D=3D 0) return (NULL); - kvm_read(kvm, addr, &paddr, sizeof(paddr)); + core_read(addr, &paddr, sizeof(paddr)); =20 - dumppcb =3D lookup("_dumppcb"); + dumppcb =3D core_lookup("_dumppcb"); if (dumppcb =3D=3D 0) return (NULL); =20 - addr =3D lookup("_dumptid"); + addr =3D core_lookup("_dumptid"); if (addr !=3D 0) - kvm_read(kvm, addr, &dumptid, sizeof(dumptid)); + core_read(addr, &dumptid, sizeof(dumptid)); else dumptid =3D -1; =20 while (paddr !=3D 0) { - if (kvm_read(kvm, paddr, &p, sizeof(p)) !=3D sizeof(p)) - warnx("kvm_read: %s", kvm_geterr(kvm)); + core_read(paddr, &p, sizeof(p)); addr =3D (uintptr_t)TAILQ_FIRST(&p.p_threads); while (addr !=3D 0) { - if (kvm_read(kvm, addr, &td, sizeof(td)) !=3D sizeof(td)) - warnx("kvm_read: %s", kvm_geterr(kvm)); + core_read(addr, &td, sizeof(td)); kt =3D malloc(sizeof(*kt)); kt->next =3D first; kt->kaddr =3D addr; @@ -188,7 +188,7 @@ if (kt =3D=3D NULL) return (NULL); p =3D (struct proc *)kt->paddr; - if (kvm_read(kvm, (uintptr_t)&p->p_comm[0], &comm, sizeof(comm)) !=3D + if (core_read((uintptr_t)&p->p_comm[0], &comm, sizeof(comm)) !=3D sizeof(comm)) return (NULL); =20 Index: src/gnu/usr.bin/gdb/kgdb/main.c diff -u src/gnu/usr.bin/gdb/kgdb/main.c:1.6 src/gnu/usr.bin/gdb/kgdb/main.c= :1.6.1000.1 --- src/gnu/usr.bin/gdb/kgdb/main.c:1.6 Thu Mar 3 02:40:04 2005 +++ src/gnu/usr.bin/gdb/kgdb/main.c Mon Jun 13 00:50:55 2005 @@ -39,7 +39,6 @@ #include #include #include -#include #include #include #include @@ -65,10 +64,9 @@ =20 #include "kgdb.h" =20 -kvm_t *kvm; - static int dumpnr; static int verbose; +static dumpcoretype dumptype; =20 static char crashdir[PATH_MAX]; static char *kernel; @@ -82,7 +80,8 @@ { =20 fprintf(stderr, - "usage: %s [-afqv] [-d crashdir] [-c core | -n dumpnr | -r device]\n" + "usage: %s [-afqv] [-d crashdir] [-c core | -n dumpnr | -r device\n" + "\t| -t dumptype]\n" "\t[kernel [core]]\n", getprogname()); exit(1); } @@ -149,6 +148,9 @@ break; } } + + /* Fetch info details */ + fclose(info); } =20 @@ -198,7 +200,7 @@ if (remote) push_remote_target (remote, 0); else - kgdb_target(); + kgdb_target(kernel, vmcore, dumptype); } =20 static void @@ -209,7 +211,7 @@ if (!once) { once =3D 1; kgdb_init_target(); - kgdb_target(); + //kgdb_target(); print_stack_frame (get_selected_frame (), frame_relative_level (get_selected_frame ()), 1); } @@ -246,6 +248,7 @@ int a, ch, quiet; =20 dumpnr =3D -1; + dumptype =3D FULLDUMP; =20 strlcpy(crashdir, "/var/crash", sizeof(crashdir)); s =3D getenv("KGDB_CRASH_DIR"); @@ -269,8 +272,17 @@ =20 quiet =3D 0; =20 - while ((ch =3D getopt(argc, argv, "ac:d:fn:qr:v")) !=3D -1) { + while ((ch =3D getopt(argc, argv, "ac:d:fn:qr:v:t:")) !=3D -1) { switch (ch) { + case 't': =09 + dumptype =3D strtol(optarg, &s, 0); + if (dumptype < 0 || dumptype > ASCIIDUMP || *s !=3D '\0') { + warnx("option %c: invalid kernel dump type", + optopt); + usage(); + /* NOTREACHED */ + } + break; case 'a': annotation_level++; break; @@ -404,15 +416,6 @@ warnx("kernel image: %s", kernel); } =20 - if (remote =3D=3D NULL) { - s =3D malloc(_POSIX2_LINE_MAX); - kvm =3D kvm_openfiles(kernel, vmcore, NULL, O_RDONLY, s); - if (kvm =3D=3D NULL) - errx(1, s); - free(s); - kgdb_thr_init(); - } - /* The libgdb code uses optind too. Reset it... */ optind =3D 0; =20 Index: src/gnu/usr.bin/gdb/kgdb/mini_trgt.c diff -u /dev/null src/gnu/usr.bin/gdb/kgdb/mini_trgt.c:1.1.1000.1 --- /dev/null Thu Jun 23 18:02:17 2005 +++ src/gnu/usr.bin/gdb/kgdb/mini_trgt.c Mon Jun 13 00:50:55 2005 @@ -0,0 +1,121 @@ +/* + * Copyright (c) 2004 Marcel Moolenaar + * 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 WARRANTI= ES + * 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 US= E, + * 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: src/gnu/usr.bin/gdb/kgdb/trgt.c,v 1.1 2004/07/25 05:29= :15 marcel Exp $"); + +#include +#include +#include +#include +#include +#include +#include +#include +#include "kgdb.h" + +#include +#include +#include +#include +#include + +#define PCB_OFFSET (0) +#define TID_OFFSET (PCB_OFFSET + sizeof(struct pcb)) +#define THR_OFFSET (TID_OFFSET + sizeof(int)) + +static int corefd; +static int kernelfd; +static struct pcb dumppcb; +static int tid; +static struct thread thr; + +static CORE_ADDR minoff, maxoff; +static char *dumpmem; + +static off_t kernel_len; +static CORE_ADDR kernel_base =3D 0xc0400000; + +static int +kgdb_trgt_xfer_memory_mini(CORE_ADDR memaddr, char *myaddr, int len, int w= rite, + struct mem_attrib *attrib __unused, struct target_ops *target __unus= ed) +{ + if (write =3D=3D 0 && memaddr >=3D minoff && (memaddr + len) < maxoff) { + bcopy(dumpmem + (memaddr - minoff), myaddr, len); + return len; + } +=09 + + if (write =3D=3D 0 && memaddr >=3D kernel_base && (memaddr + len) < (kern= el_base + kernel_len)) { + lseek(kernelfd, memaddr - kernel_base, SEEK_SET); + read(kernelfd, myaddr, len); + return len; + } +=09 + //bzero(myaddr, len);=09 + return -1; +} + +void trgt_provide_registers(struct pcb*); + +static void +kgdb_trgt_fetch_registers_mini(int regno __unused) +{ + trgt_provide_registers(&dumppcb); +} + +static void +load_file() +{ + lseek(corefd, 0, SEEK_SET); + read(corefd, &dumppcb, sizeof(struct pcb)); + read(corefd, &tid, sizeof(tid)); + read(corefd, &thr, sizeof(thr)); + + minoff =3D thr.td_kstack; + maxoff =3D thr.td_kstack + PAGE_SIZE * thr.td_kstack_pages; +=09 + dumpmem =3D malloc(maxoff - minoff); + read(corefd, dumpmem, maxoff - minoff); + + kernel_len =3D lseek(kernelfd, 0, SEEK_END); +} + +struct kthr *kgdb_thr_init_direct(struct pcb *dumppcb, struct thread *pcb,= int tid); + +void kgdb_trgt_init_mini(struct target_ops* kgdb_trgt_ops, char* kernel, c= har* vmcore) +{ + kgdb_trgt_ops->to_xfer_memory =3D kgdb_trgt_xfer_memory_mini; + kgdb_trgt_ops->to_fetch_registers =3D kgdb_trgt_fetch_registers_mini; +=09 + corefd =3D open(vmcore, O_RDONLY); + kernelfd =3D open(kernel, O_RDONLY); + if (corefd =3D=3D -1 || kernelfd =3D=3D -1) + errx(1, "Can not open core or kernel."); + load_file(); + + kgdb_thr_init_direct(&dumppcb, &thr, tid); +} Index: src/gnu/usr.bin/gdb/kgdb/trgt.c diff -u src/gnu/usr.bin/gdb/kgdb/trgt.c:1.2 src/gnu/usr.bin/gdb/kgdb/trgt.c= :1.2.1000.1 --- src/gnu/usr.bin/gdb/kgdb/trgt.c:1.2 Mon Feb 21 06:55:07 2005 +++ src/gnu/usr.bin/gdb/kgdb/trgt.c Mon Jun 13 00:50:55 2005 @@ -31,7 +31,10 @@ #include #include #include -#include +#include +#include +#include +#include =20 #include #include @@ -96,13 +99,8 @@ kgdb_trgt_xfer_memory(CORE_ADDR memaddr, char *myaddr, int len, int write, struct mem_attrib *attrib __unused, struct target_ops *target __unused) { - if (len =3D=3D 0) - return (0); - - if (!write) - return (kvm_read(kvm, memaddr, myaddr, len)); - else - return (kvm_write(kvm, memaddr, myaddr, len)); + fprintf_unfiltered(gdb_stderr, "XXX: %s\n", __func__); + return (0); } =20 static void @@ -127,9 +125,6 @@ if (!arg) error_no_arg ("proc address for the new context"); =20 - if (kvm =3D=3D NULL) - error ("no kernel core file"); - addr =3D (CORE_ADDR) parse_and_eval_address (arg); =20 if (!INKERNEL (addr)) { @@ -153,9 +148,6 @@ if (!arg) error_no_arg ("TID or thread address for the new context"); =20 - if (kvm =3D=3D NULL) - error ("no kernel core file"); - addr =3D (CORE_ADDR) parse_and_eval_address (arg); =20 if (!INKERNEL (addr)) { @@ -170,12 +162,56 @@ kgdb_switch_to_thread(thr); } =20 +int core_read(uintptr_t memaddr, void *myaddr, int len) +{ + return (kgdb_trgt_ops.to_xfer_memory(memaddr, myaddr, len, 0, NULL, NULL= )); +} + +int core_write(uintptr_t memaddr, void *myaddr, int len) +{ + return (kgdb_trgt_ops.to_xfer_memory(memaddr, myaddr, len, 1, NULL, NULL= )); +} +=20 +static int nlfd; +/* from src/lib/libc/gen/nlist.c */ +int __fdnlist(int, struct nlist *); +=20 +uintptr_t core_lookup(const char *sym) +{ + struct nlist nl[2]; +=20 + nl[0].n_name =3D (char *)(uintptr_t)sym; + nl[1].n_name =3D NULL; + if (__fdnlist(nlfd, nl) !=3D 0) { + return (0); + } + return (nl[0].n_value); +} + +static void +kgdb_trgt_fetch_registers(int regno __unused) +{ + fprintf_unfiltered(gdb_stderr, "XXX: %s\n", __func__); +} + +static void +kgdb_trgt_store_registers(int regno __unused) +{ + fprintf_unfiltered(gdb_stderr, "XXX: %s\n", __func__); +} + void -kgdb_target(void) +kgdb_target(char* kernel, char* vmcore, dumpcoretype type) { struct kthr *kt; struct thread_info *ti; =20 + if (kernel !=3D NULL) { + nlfd =3D open(kernel, O_RDONLY, 0); + if (nlfd !=3D -1) + fcntl(nlfd, F_SETFD, FD_CLOEXEC); + } + kgdb_trgt_ops.to_magic =3D OPS_MAGIC; kgdb_trgt_ops.to_shortname =3D "kernel"; kgdb_trgt_ops.to_longname =3D "kernel core files."; @@ -192,6 +228,18 @@ kgdb_trgt_ops.to_store_registers =3D kgdb_trgt_store_registers; kgdb_trgt_ops.to_thread_alive =3D kgdb_trgt_thread_alive; kgdb_trgt_ops.to_xfer_memory =3D kgdb_trgt_xfer_memory; +=09 + switch(type) { + case FULLDUMP: + kgdb_trgt_init_full(&kgdb_trgt_ops, kernel, vmcore); + break; + case MINIDUMP: + kgdb_trgt_init_mini(&kgdb_trgt_ops, kernel, vmcore); + break; + default: + return; + } + add_target(&kgdb_trgt_ops); push_target(&kgdb_trgt_ops); =20 @@ -200,7 +248,8 @@ ti =3D add_thread(ptid_build(kt->pid, 0, kt->tid)); kt =3D kgdb_thr_next(kt); } - inferior_ptid =3D ptid_build(curkthr->pid, 0, curkthr->tid); + if (curkthr !=3D NULL) + inferior_ptid =3D ptid_build(curkthr->tid, 0, 0); add_com ("proc", class_obscure, kgdb_set_proc_cmd, "Set current process context"); add_com ("tid", class_obscure, kgdb_set_tid_cmd, Index: src/gnu/usr.bin/gdb/kgdb/trgt_alpha.c diff -u src/gnu/usr.bin/gdb/kgdb/trgt_alpha.c:1.2 src/gnu/usr.bin/gdb/kgdb/= trgt_alpha.c:1.2.1000.1 --- src/gnu/usr.bin/gdb/kgdb/trgt_alpha.c:1.2 Mon Feb 21 06:55:07 2005 +++ src/gnu/usr.bin/gdb/kgdb/trgt_alpha.c Mon Jun 13 00:50:55 2005 @@ -29,9 +29,6 @@ =20 #include #include -#include -#include -#include =20 #include "kgdb.h" =20 @@ -42,32 +39,15 @@ #include =20 void -kgdb_trgt_fetch_registers(int regno __unused) +trgt_provide_registers(struct pcb *pcb) { - struct kthr *kt; - struct pcb pcb; - - kt =3D kgdb_thr_lookup_tid(ptid_get_tid(inferior_ptid)); - if (kt =3D=3D NULL) - return; - if (kvm_read(kvm, kt->pcb, &pcb, sizeof(pcb)) !=3D sizeof(pcb)) { - warnx("kvm_read: %s", kvm_geterr(kvm)); - memset(&pcb, 0, sizeof(pcb)); - } - - supply_register(9, (char *)&pcb.pcb_context[0]); - supply_register(10, (char *)&pcb.pcb_context[1]); - supply_register(11, (char *)&pcb.pcb_context[2]); - supply_register(12, (char *)&pcb.pcb_context[3]); - supply_register(13, (char *)&pcb.pcb_context[4]); - supply_register(14, (char *)&pcb.pcb_context[5]); - supply_register(15, (char *)&pcb.pcb_context[6]); - supply_register(30, (char *)&pcb.pcb_hw.apcb_ksp); - supply_register(64, (char *)&pcb.pcb_context[7]); -} - -void -kgdb_trgt_store_registers(int regno __unused) -{ - fprintf_unfiltered(gdb_stderr, "XXX: %s\n", __func__); + supply_register(9, (char *)&pcb->pcb_context[0]); + supply_register(10, (char *)&pcb->pcb_context[1]); + supply_register(11, (char *)&pcb->pcb_context[2]); + supply_register(12, (char *)&pcb->pcb_context[3]); + supply_register(13, (char *)&pcb->pcb_context[4]); + supply_register(14, (char *)&pcb->pcb_context[5]); + supply_register(15, (char *)&pcb->pcb_context[6]); + supply_register(30, (char *)&pcb->pcb_hw.apcb_ksp); + supply_register(64, (char *)&pcb->pcb_context[7]); } Index: src/gnu/usr.bin/gdb/kgdb/trgt_amd64.c diff -u src/gnu/usr.bin/gdb/kgdb/trgt_amd64.c:1.2 src/gnu/usr.bin/gdb/kgdb/= trgt_amd64.c:1.2.1000.1 --- src/gnu/usr.bin/gdb/kgdb/trgt_amd64.c:1.2 Mon Feb 21 06:55:07 2005 +++ src/gnu/usr.bin/gdb/kgdb/trgt_amd64.c Mon Jun 13 00:50:55 2005 @@ -29,9 +29,6 @@ =20 #include #include -#include -#include -#include =20 #include "kgdb.h" =20 @@ -42,32 +39,15 @@ #include =20 void -kgdb_trgt_fetch_registers(int regno __unused) +trgt_provide_registers(struct pcb *pcb) { - struct kthr *kt; - struct pcb pcb; - - kt =3D kgdb_thr_lookup_tid(ptid_get_tid(inferior_ptid)); - if (kt =3D=3D NULL) - return; - if (kvm_read(kvm, kt->pcb, &pcb, sizeof(pcb)) !=3D sizeof(pcb)) { - warnx("kvm_read: %s", kvm_geterr(kvm)); - memset(&pcb, 0, sizeof(pcb)); - } - - supply_register(1, (char *)&pcb.pcb_rbx); - supply_register(6, (char *)&pcb.pcb_rbp); - supply_register(7, (char *)&pcb.pcb_rsp); - supply_register(12, (char *)&pcb.pcb_r12); - supply_register(13, (char *)&pcb.pcb_r13); - supply_register(14, (char *)&pcb.pcb_r14); - supply_register(15, (char *)&pcb.pcb_r15); - supply_register(16, (char *)&pcb.pcb_rip); - supply_register(17, (char *)&pcb.pcb_rflags); -} - -void -kgdb_trgt_store_registers(int regno __unused) -{ - fprintf_unfiltered(gdb_stderr, "XXX: %s\n", __func__); + supply_register(1, (char *)&pcb->pcb_rbx); + supply_register(6, (char *)&pcb->pcb_rbp); + supply_register(7, (char *)&pcb->pcb_rsp); + supply_register(12, (char *)&pcb->pcb_r12); + supply_register(13, (char *)&pcb->pcb_r13); + supply_register(14, (char *)&pcb->pcb_r14); + supply_register(15, (char *)&pcb->pcb_r15); + supply_register(16, (char *)&pcb->pcb_rip); + supply_register(17, (char *)&pcb->pcb_rflags); } Index: src/gnu/usr.bin/gdb/kgdb/trgt_i386.c diff -u src/gnu/usr.bin/gdb/kgdb/trgt_i386.c:1.2 src/gnu/usr.bin/gdb/kgdb/t= rgt_i386.c:1.2.1000.1 --- src/gnu/usr.bin/gdb/kgdb/trgt_i386.c:1.2 Mon Feb 21 06:55:07 2005 +++ src/gnu/usr.bin/gdb/kgdb/trgt_i386.c Mon Jun 13 00:50:55 2005 @@ -29,9 +29,6 @@ =20 #include #include -#include -#include -#include =20 #include "kgdb.h" =20 @@ -42,28 +39,12 @@ #include =20 void -kgdb_trgt_fetch_registers(int regno __unused) +trgt_provide_registers(struct pcb *pcb) { - struct kthr *kt; - struct pcb pcb; - - kt =3D kgdb_thr_lookup_tid(ptid_get_tid(inferior_ptid)); - if (kt =3D=3D NULL) - return; - if (kvm_read(kvm, kt->pcb, &pcb, sizeof(pcb)) !=3D sizeof(pcb)) { - warnx("kvm_read: %s", kvm_geterr(kvm)); - memset(&pcb, 0, sizeof(pcb)); - } - supply_register(3, (char *)&pcb.pcb_ebx); - supply_register(4, (char *)&pcb.pcb_esp); - supply_register(5, (char *)&pcb.pcb_ebp); - supply_register(6, (char *)&pcb.pcb_esi); - supply_register(7, (char *)&pcb.pcb_edi); - supply_register(8, (char *)&pcb.pcb_eip); -} - -void -kgdb_trgt_store_registers(int regno __unused) -{ - fprintf_unfiltered(gdb_stderr, "XXX: %s\n", __func__); + supply_register(3, (char *)&pcb->pcb_ebx); + supply_register(4, (char *)&pcb->pcb_esp); + supply_register(5, (char *)&pcb->pcb_ebp); + supply_register(6, (char *)&pcb->pcb_esi); + supply_register(7, (char *)&pcb->pcb_edi); + supply_register(8, (char *)&pcb->pcb_eip); } Index: src/gnu/usr.bin/gdb/kgdb/trgt_ia64.c diff -u src/gnu/usr.bin/gdb/kgdb/trgt_ia64.c:1.2 src/gnu/usr.bin/gdb/kgdb/t= rgt_ia64.c:1.2.1000.1 --- src/gnu/usr.bin/gdb/kgdb/trgt_ia64.c:1.2 Mon Feb 21 06:55:07 2005 +++ src/gnu/usr.bin/gdb/kgdb/trgt_ia64.c Mon Jun 13 00:50:55 2005 @@ -30,9 +30,6 @@ #include #include #include -#include -#include -#include =20 #include "kgdb.h" =20 @@ -43,73 +40,63 @@ #include =20 void -kgdb_trgt_fetch_registers(int regno __unused) +trgt_provide_registers(struct pcb *pcb) { - struct kthr *kt; - struct pcb pcb; uint64_t r; =20 - kt =3D kgdb_thr_lookup_tid(ptid_get_tid(inferior_ptid)); - if (kt =3D=3D NULL) - return; - if (kvm_read(kvm, kt->pcb, &pcb, sizeof(pcb)) !=3D sizeof(pcb)) { - warnx("kvm_read: %s", kvm_geterr(kvm)); - memset(&pcb, 0, sizeof(pcb)); - } - /* Registers 0-127: general registers. */ - supply_register(1, (char *)&pcb.pcb_special.gp); - supply_register(4, (char *)&pcb.pcb_preserved.gr4); - supply_register(5, (char *)&pcb.pcb_preserved.gr5); - supply_register(6, (char *)&pcb.pcb_preserved.gr6); - supply_register(7, (char *)&pcb.pcb_preserved.gr7); - supply_register(12, (char *)&pcb.pcb_special.sp); - supply_register(13, (char *)&pcb.pcb_special.tp); + supply_register(1, (char *)&pcb->pcb_special.gp); + supply_register(4, (char *)&pcb->pcb_preserved.gr4); + supply_register(5, (char *)&pcb->pcb_preserved.gr5); + supply_register(6, (char *)&pcb->pcb_preserved.gr6); + supply_register(7, (char *)&pcb->pcb_preserved.gr7); + supply_register(12, (char *)&pcb->pcb_special.sp); + supply_register(13, (char *)&pcb->pcb_special.tp); =20 /* Registers 128-255: floating-point registers. */ - supply_register(130, (char *)&pcb.pcb_preserved_fp.fr2); - supply_register(131, (char *)&pcb.pcb_preserved_fp.fr3); - supply_register(132, (char *)&pcb.pcb_preserved_fp.fr4); - supply_register(133, (char *)&pcb.pcb_preserved_fp.fr5); - supply_register(144, (char *)&pcb.pcb_preserved_fp.fr16); - supply_register(145, (char *)&pcb.pcb_preserved_fp.fr17); - supply_register(146, (char *)&pcb.pcb_preserved_fp.fr18); - supply_register(147, (char *)&pcb.pcb_preserved_fp.fr19); - supply_register(148, (char *)&pcb.pcb_preserved_fp.fr20); - supply_register(149, (char *)&pcb.pcb_preserved_fp.fr21); - supply_register(150, (char *)&pcb.pcb_preserved_fp.fr22); - supply_register(151, (char *)&pcb.pcb_preserved_fp.fr23); - supply_register(152, (char *)&pcb.pcb_preserved_fp.fr24); - supply_register(153, (char *)&pcb.pcb_preserved_fp.fr25); - supply_register(154, (char *)&pcb.pcb_preserved_fp.fr26); - supply_register(155, (char *)&pcb.pcb_preserved_fp.fr27); - supply_register(156, (char *)&pcb.pcb_preserved_fp.fr28); - supply_register(157, (char *)&pcb.pcb_preserved_fp.fr29); - supply_register(158, (char *)&pcb.pcb_preserved_fp.fr30); - supply_register(159, (char *)&pcb.pcb_preserved_fp.fr31); + supply_register(130, (char *)&pcb->pcb_preserved_fp.fr2); + supply_register(131, (char *)&pcb->pcb_preserved_fp.fr3); + supply_register(132, (char *)&pcb->pcb_preserved_fp.fr4); + supply_register(133, (char *)&pcb->pcb_preserved_fp.fr5); + supply_register(144, (char *)&pcb->pcb_preserved_fp.fr16); + supply_register(145, (char *)&pcb->pcb_preserved_fp.fr17); + supply_register(146, (char *)&pcb->pcb_preserved_fp.fr18); + supply_register(147, (char *)&pcb->pcb_preserved_fp.fr19); + supply_register(148, (char *)&pcb->pcb_preserved_fp.fr20); + supply_register(149, (char *)&pcb->pcb_preserved_fp.fr21); + supply_register(150, (char *)&pcb->pcb_preserved_fp.fr22); + supply_register(151, (char *)&pcb->pcb_preserved_fp.fr23); + supply_register(152, (char *)&pcb->pcb_preserved_fp.fr24); + supply_register(153, (char *)&pcb->pcb_preserved_fp.fr25); + supply_register(154, (char *)&pcb->pcb_preserved_fp.fr26); + supply_register(155, (char *)&pcb->pcb_preserved_fp.fr27); + supply_register(156, (char *)&pcb->pcb_preserved_fp.fr28); + supply_register(157, (char *)&pcb->pcb_preserved_fp.fr29); + supply_register(158, (char *)&pcb->pcb_preserved_fp.fr30); + supply_register(159, (char *)&pcb->pcb_preserved_fp.fr31); =20 /* Registers 320-327: branch registers. */ if (pcb.pcb_special.__spare =3D=3D ~0UL) - supply_register(320, (char *)&pcb.pcb_special.rp); - supply_register(321, (char *)&pcb.pcb_preserved.br1); - supply_register(322, (char *)&pcb.pcb_preserved.br2); - supply_register(323, (char *)&pcb.pcb_preserved.br3); - supply_register(324, (char *)&pcb.pcb_preserved.br4); - supply_register(325, (char *)&pcb.pcb_preserved.br5); + supply_register(320, (char *)&pcb->pcb_special.rp); + supply_register(321, (char *)&pcb->pcb_preserved.br1); + supply_register(322, (char *)&pcb->pcb_preserved.br2); + supply_register(323, (char *)&pcb->pcb_preserved.br3); + supply_register(324, (char *)&pcb->pcb_preserved.br4); + supply_register(325, (char *)&pcb->pcb_preserved.br5); =20 /* Registers 328-333: misc. other registers. */ - supply_register(330, (char *)&pcb.pcb_special.pr); + supply_register(330, (char *)&pcb->pcb_special.pr); if (pcb.pcb_special.__spare =3D=3D ~0UL) { r =3D pcb.pcb_special.iip + ((pcb.pcb_special.psr >> 41) & 3); supply_register(331, (char *)&r); - supply_register(333, (char *)&pcb.pcb_special.cfm); + supply_register(333, (char *)&pcb->pcb_special.cfm); } else { - supply_register(331, (char *)&pcb.pcb_special.rp); - supply_register(333, (char *)&pcb.pcb_special.pfs); + supply_register(331, (char *)&pcb->pcb_special.rp); + supply_register(333, (char *)&pcb->pcb_special.pfs); } =20 /* Registers 334-461: application registers. */ - supply_register(350, (char *)&pcb.pcb_special.rsc); + supply_register(350, (char *)&pcb->pcb_special.rsc); r =3D pcb.pcb_special.bspstore; if (pcb.pcb_special.__spare =3D=3D ~0UL) r +=3D pcb.pcb_special.ndirty; @@ -118,16 +105,10 @@ IA64_CFM_SOL(pcb.pcb_special.pfs)); supply_register(351, (char *)&r); /* bsp */ supply_register(352, (char *)&r); /* bspstore */ - supply_register(353, (char *)&pcb.pcb_special.rnat); - supply_register(370, (char *)&pcb.pcb_special.unat); - supply_register(374, (char *)&pcb.pcb_special.fpsr); + supply_register(353, (char *)&pcb->pcb_special.rnat); + supply_register(370, (char *)&pcb->pcb_special.unat); + supply_register(374, (char *)&pcb->pcb_special.fpsr); if (pcb.pcb_special.__spare =3D=3D ~0UL) - supply_register(398, (char *)&pcb.pcb_special.pfs); - supply_register(399, (char *)&pcb.pcb_preserved.lc); -} - -void -kgdb_trgt_store_registers(int regno __unused) -{ - fprintf_unfiltered(gdb_stderr, "XXX: %s\n", __func__); + supply_register(398, (char *)&pcb->pcb_special.pfs); + supply_register(399, (char *)&pcb->pcb_preserved.lc); } Index: src/gnu/usr.bin/gdb/kgdb/trgt_sparc64.c diff -u src/gnu/usr.bin/gdb/kgdb/trgt_sparc64.c:1.2 src/gnu/usr.bin/gdb/kgd= b/trgt_sparc64.c:1.2.1000.1 --- src/gnu/usr.bin/gdb/kgdb/trgt_sparc64.c:1.2 Mon Feb 21 06:55:07 2005 +++ src/gnu/usr.bin/gdb/kgdb/trgt_sparc64.c Mon Jun 13 00:50:55 2005 @@ -30,9 +30,6 @@ #include #include #include -#include -#include -#include =20 #include "kgdb.h" =20 @@ -43,39 +40,23 @@ #include =20 void -kgdb_trgt_fetch_registers(int regno __unused) +trgt_provide_registers(struct pcb *pcb) { - struct kthr *kt; - struct pcb pcb; uint64_t r; =20 - kt =3D kgdb_thr_lookup_tid(ptid_get_tid(inferior_ptid)); - if (kt =3D=3D NULL) - return; - if (kvm_read(kvm, kt->pcb, &pcb, sizeof(pcb)) !=3D sizeof(pcb)) { - warnx("kvm_read: %s", kvm_geterr(kvm)); - memset(&pcb, 0, sizeof(pcb)); - } - /* 0-7: global registers (g0-g7) */ =20 /* 8-15: output registers (o0-o7) */ - r =3D pcb.pcb_sp - CCFSZ; + r =3D pcb->pcb_sp - CCFSZ; supply_register(14, (char *)&r); =20 /* 16-23: local registers (l0-l7) */ =20 /* 24-31: input registers (i0-i7) */ - supply_register(30, (char *)&pcb.pcb_sp); + supply_register(30, (char *)&pcb->pcb_sp); =20 /* 32-63: single precision FP (f0-f31) */ =20 /* 64-79: double precision FP (f32-f62) */ - supply_register(80, (char *)&pcb.pcb_pc); -} - -void -kgdb_trgt_store_registers(int regno __unused) -{ - fprintf_unfiltered(gdb_stderr, "XXX: %s\n", __func__); + supply_register(80, (char *)&pcb->pcb_pc); } Index: src/sbin/savecore/savecore.c diff -u src/sbin/savecore/savecore.c:1.75 src/sbin/savecore/savecore.c:1.74= .1000.3 --- src/sbin/savecore/savecore.c:1.75 Tue Jun 21 04:01:29 2005 +++ src/sbin/savecore/savecore.c Tue Jun 21 08:45:06 2005 @@ -107,7 +107,18 @@ =20 fprintf(f, "Dump header from device %s\n", device); fprintf(f, " Architecture: %s\n", h->architecture); - fprintf(f, " Architecture Version: %u\n", h->architectureversion); + fprintf(f, " Dumptype: "); + switch(h->dumptype) { + case MINIDUMP: + fprintf(f, "Mini Dump\n"); + break; + case ASCIIDUMP: + fprintf(f, "ASCII Dump\n"); + break; + case FULLDUMP: + default: + fprintf(f, "Full Dump\n"); + } dumplen =3D dtoh64(h->dumplength); fprintf(f, " Dump Length: %lldB (%lld MB)\n", (long long)dumplen, (long long)(dumplen >> 20)); Index: src/sys/alpha/alpha/dump_machdep.c diff -u src/sys/alpha/alpha/dump_machdep.c:1.6 src/sys/alpha/alpha/dump_mac= hdep.c:1.6.1000.1 --- src/sys/alpha/alpha/dump_machdep.c:1.6 Tue Dec 23 10:36:41 2003 +++ src/sys/alpha/alpha/dump_machdep.c Thu Jun 16 20:35:37 2005 @@ -64,7 +64,7 @@ strcpy(kdh.magic, KERNELDUMPMAGIC); strcpy(kdh.architecture, "alpha"); kdh.version =3D htod32(KERNELDUMPVERSION); - kdh.architectureversion =3D htod32(KERNELDUMP_ALPHA_VERSION); + kdh.dumptype =3D htod32(FULLDUMP); kdh.dumplength =3D htod64(Maxmem * (off_t)PAGE_SIZE); kdh.dumptime =3D htod64(time_second); kdh.blocksize =3D htod32(di->blocksize); Index: src/sys/amd64/amd64/dump_machdep.c diff -u src/sys/amd64/amd64/dump_machdep.c:1.9 src/sys/amd64/amd64/dump_mac= hdep.c:1.9.1000.1 --- src/sys/amd64/amd64/dump_machdep.c:1.9 Sat Jul 26 05:15:44 2003 +++ src/sys/amd64/amd64/dump_machdep.c Thu Jun 16 20:35:38 2005 @@ -66,7 +66,7 @@ strcpy(kdh.magic, KERNELDUMPMAGIC); strcpy(kdh.architecture, "amd64"); kdh.version =3D htod32(KERNELDUMPVERSION); - kdh.architectureversion =3D htod32(KERNELDUMP_I386_VERSION); + kdh.dumptype =3D htod32(FULLDUMP); kdh.dumplength =3D htod64(Maxmem * (off_t)PAGE_SIZE); kdh.dumptime =3D htod64(time_second); kdh.blocksize =3D htod32(di->blocksize); Index: src/sys/conf/files diff -u src/sys/conf/files:1.1030 src/sys/conf/files:1.1029.1000.2 --- src/sys/conf/files:1.1030 Tue Jun 21 18:17:54 2005 +++ src/sys/conf/files Thu Jun 23 00:31:08 2005 @@ -1226,6 +1226,7 @@ kern/subr_clock.c optional genclock kern/subr_devstat.c standard kern/subr_disk.c standard +kern/subr_dump.c standard kern/subr_eventhandler.c standard kern/subr_hints.c standard kern/subr_kdb.c standard Index: src/sys/dev/null/null.c diff -u src/sys/dev/null/null.c:1.31 src/sys/dev/null/null.c:1.31.1000.1 --- src/sys/dev/null/null.c:1.31 Mon Feb 28 06:00:45 2005 +++ src/sys/dev/null/null.c Mon Jun 20 09:32:14 2005 @@ -34,6 +34,7 @@ #include #include #include +#include #include #include #include Index: src/sys/geom/geom_dev.c diff -u src/sys/geom/geom_dev.c:1.89 src/sys/geom/geom_dev.c:1.89.1000.1 --- src/sys/geom/geom_dev.c:1.89 Fri Mar 18 14:57:58 2005 +++ src/sys/geom/geom_dev.c Mon Jun 20 09:32:13 2005 @@ -41,6 +41,7 @@ #include #include #include +#include #include #include #include Index: src/sys/geom/geom_disk.c diff -u src/sys/geom/geom_disk.c:1.96 src/sys/geom/geom_disk.c:1.96.1000.1 --- src/sys/geom/geom_disk.c:1.96 Fri Mar 18 15:01:31 2005 +++ src/sys/geom/geom_disk.c Sun Jun 19 23:43:44 2005 @@ -46,6 +46,7 @@ #include #include #include +#include #include #include #include Index: src/sys/i386/i386/dump_machdep.c diff -u src/sys/i386/i386/dump_machdep.c:1.9 src/sys/i386/i386/dump_machdep= .c:1.9.1000.3 --- src/sys/i386/i386/dump_machdep.c:1.9 Mon Aug 25 17:48:46 2003 +++ src/sys/i386/i386/dump_machdep.c Mon Jun 20 09:32:13 2005 @@ -46,57 +46,21 @@ #include #include =20 -CTASSERT(sizeof(struct kerneldumpheader) =3D=3D 512); - -static struct kerneldumpheader kdh; - void dumpsys(struct dumperinfo *di) { - off_t dumplo; vm_offset_t a, addr; u_int count, left, u; void *va; - int i, mb; + int i; int c; =20 - printf("Dumping %ld MB\n", Maxmem / (1024*1024 / PAGE_SIZE)); - - /* Fill in the kernel dump header */ - strcpy(kdh.magic, KERNELDUMPMAGIC); - strcpy(kdh.architecture, "i386"); - kdh.version =3D htod32(KERNELDUMPVERSION); - kdh.architectureversion =3D htod32(KERNELDUMP_I386_VERSION); - kdh.dumplength =3D htod64(Maxmem * (off_t)PAGE_SIZE); - kdh.dumptime =3D htod64(time_second); - kdh.blocksize =3D htod32(di->blocksize); - strncpy(kdh.hostname, hostname, sizeof kdh.hostname); - strncpy(kdh.versionstring, version, sizeof kdh.versionstring); - if (panicstr !=3D NULL) - strncpy(kdh.panicstring, panicstr, sizeof kdh.panicstring); - kdh.parity =3D kerneldump_parity(&kdh); - - /* - * Check if we will have enough room to save the coredump. - * The partition size needed is the sum of: - * Memory to save + header + trailer + Room to leave untouched - * at partition head. (an arbitrary amount). - */ - if (di->mediasize < =20 - Maxmem * (off_t)PAGE_SIZE + sizeof kdh * 2 + 64*1024) { - printf("\nDump failed. Partition too small.\n"); - return; - } - dumplo =3D di->mediaoffset + di->mediasize - Maxmem * (off_t)PAGE_SIZE; - dumplo -=3D sizeof kdh * 2; - i =3D di->dumper(di->priv, &kdh, 0, dumplo, sizeof kdh); + i =3D dump_open(Maxmem * (off_t)PAGE_SIZE); if (i) printf("\nDump failed writing header (%d)\n", i); - dumplo +=3D sizeof kdh; i =3D 0; addr =3D 0; va =3D 0; - mb =3D 0; for (count =3D 0; count < Maxmem;) { left =3D Maxmem - count; if (left > MAXDUMPPGS) @@ -107,16 +71,10 @@ a =3D 0; va =3D pmap_kenter_temporary(trunc_page(a), u); } - i =3D count / (16*1024*1024 / PAGE_SIZE); - if (i !=3D mb) { - printf(" %d", count / (1024 * 1024 / PAGE_SIZE)); - mb =3D i; - } - i =3D di->dumper(di->priv, va, 0, dumplo, left * PAGE_SIZE); + i =3D dump_write(va, left * PAGE_SIZE); if (i) break; count +=3D left; - dumplo +=3D left * PAGE_SIZE; addr +=3D left * PAGE_SIZE; if ((c =3D cncheckc()) =3D=3D 0x03) { printf("\nDump aborted.\n"); @@ -124,12 +82,14 @@ } else if (c !=3D -1) printf("[CTRL-C to abort] "); } - if (i)=20 + if (i) { printf("\nDump failed writing data (%d)\n", i); - i =3D di->dumper(di->priv, &kdh, 0, dumplo, sizeof kdh); + return; + } + i =3D dump_close(); if (i) printf("\nDump failed writing trailer (%d)\n", i); - di->dumper(di->priv, NULL, 0, 0, 0); /* tell them we are done */ - printf("\nDump complete\n"); + else + printf("\nDump complete\n"); return; } Index: src/sys/ia64/ia64/dump_machdep.c diff -u src/sys/ia64/ia64/dump_machdep.c:1.12 src/sys/ia64/ia64/dump_machde= p.c:1.12.1000.1 --- src/sys/ia64/ia64/dump_machdep.c:1.12 Fri Jan 7 06:18:22 2005 +++ src/sys/ia64/ia64/dump_machdep.c Thu Jun 16 20:35:39 2005 @@ -61,15 +61,14 @@ =20 /* XXX should be MI */ static void -mkdumpheader(struct kerneldumpheader *kdh, uint32_t archver, uint64_t dump= len, - uint32_t blksz) +mkdumpheader(struct kerneldumpheader *kdh, uint64_t dumplen, uint32_t blks= z) { =20 bzero(kdh, sizeof(*kdh)); strncpy(kdh->magic, KERNELDUMPMAGIC, sizeof(kdh->magic)); strncpy(kdh->architecture, MACHINE_ARCH, sizeof(kdh->architecture)); kdh->version =3D htod32(KERNELDUMPVERSION); - kdh->architectureversion =3D htod32(archver); + kdh->dumptype =3D htod32(FULLDUMP); kdh->dumplength =3D htod64(dumplen); kdh->dumptime =3D htod64(time_second); kdh->blocksize =3D htod32(blksz); @@ -259,7 +258,7 @@ dumplo =3D di->mediaoffset + di->mediasize - dumpsize; dumplo -=3D sizeof(kdh) * 2; =20 - mkdumpheader(&kdh, KERNELDUMP_IA64_VERSION, dumpsize, di->blocksize); + mkdumpheader(&kdh, dumpsize, di->blocksize); =20 printf("Dumping %llu MB (%d chunks)\n", (long long)dumpsize >> 20, ehdr.e_phnum); Index: src/sys/kern/kern_shutdown.c diff -u src/sys/kern/kern_shutdown.c:1.174 src/sys/kern/kern_shutdown.c:1.1= 74.1000.2 --- src/sys/kern/kern_shutdown.c:1.174 Tue Apr 12 13:45:58 2005 +++ src/sys/kern/kern_shutdown.c Mon Jun 20 10:03:45 2005 @@ -52,6 +52,7 @@ #include #include #include +#include #include #include #include @@ -110,13 +111,6 @@ */ const char *panicstr; =20 -int dumping; /* system is dumping */ -static struct dumperinfo dumper; /* our selected dumper */ - -/* Context information for dump-debuggers. */ -static struct pcb dumppcb; /* Registers. */ -static lwpid_t dumptid; /* Thread ID. */ - static void boot(int) __dead2; static void poweroff_wait(void *, int); static void shutdown_halt(void *junk, int howto); @@ -216,26 +210,6 @@ printf("%lds\n", (long)ts.tv_sec); } =20 -static void -doadump(void) -{ - - /* - * Sometimes people have to call this from the kernel debugger.=20 - * (if 'panic' can not dump) - * Give them a clue as to why they can't dump. - */ - if (dumper.dumper =3D=3D NULL) { - printf("Cannot dump. No dump device defined.\n"); - return; - } - - savectx(&dumppcb); - dumptid =3D curthread->td_tid; - dumping++; - dumpsys(&dumper); -} - /* * Shutdown the system cleanly to prepare for reboot, halt, or power off. */ @@ -393,7 +367,7 @@ /* XXX This doesn't disable interrupts any more. Reconsider? */ splhigh(); =20 - if ((howto & (RB_HALT|RB_DUMP)) =3D=3D RB_DUMP && !cold && !dumping)=20 + if ((howto & (RB_HALT|RB_DUMP)) =3D=3D RB_DUMP && !cold)=20 doadump(); =20 /* Now that we're going to really halt the system... */ @@ -605,27 +579,3 @@ else printf("done\n"); } - -/* Registration of dumpers */ -int -set_dumper(struct dumperinfo *di) -{ - - if (di =3D=3D NULL) { - bzero(&dumper, sizeof dumper); - return (0); - } - if (dumper.dumper !=3D NULL) - return (EBUSY); - dumper =3D *di; - return (0); -} - -#if defined(__powerpc__) -void -dumpsys(struct dumperinfo *di __unused) -{ - - printf("Kernel dumps not implemented on this architecture\n"); -} -#endif Index: src/sys/kern/subr_dump.c diff -u /dev/null src/sys/kern/subr_dump.c:1.1.1000.7 --- /dev/null Thu Jun 23 18:02:17 2005 +++ src/sys/kern/subr_dump.c Thu Jun 23 01:41:00 2005 @@ -0,0 +1,291 @@ +/*- + * Copyright (c) 1986, 1988, 1991, 1993 + * The Regents of the University of California. All rights reserved. + * (c) UNIX System Laboratories, Inc. + * All or some portions of this file are derived from material licensed + * to the University of California by American Telephone and Telegraph + * Co. or Unix System Laboratories, Inc. and are reproduced herein with + * the permission of UNIX System Laboratories, Inc. + * + * 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 PURP= OSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENT= IAL + * 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, STR= ICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY W= AY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include + +int dumping; /* system is dumping */ + +/* + * Don't touch the first SIZEOF_METADATA bytes on the dump device. This + * is to protect us from metadata and to protect metadata from us. + */ +#define SIZEOF_METADATA (64*1024) + +#define DEV_ALIGN(x) (((off_t)(x) + (DEV_BSIZE-1)) & ~(DEV_BSIZE-1)) + +static struct dumperinfo di; /* our selected dumper */ + +/* Context information for dump-debuggers. */ +static struct pcb dumppcb; /* Registers. */ +static lwpid_t dumptid; /* Thread ID. */ + +static int dumptype =3D 1; +SYSCTL_INT(_kern, OID_AUTO, panic_dump_type, CTLFLAG_RW, + &dumptype, 0,=20 + "Dump Type: 1->mini, 2->ascii, 3->kernelonly, other->full"); + +CTASSERT(sizeof(struct kerneldumpheader) =3D=3D 512); + +static struct kerneldumpheader kdh; +static off_t dumplo; + +/* Handle buffered writes. */ +static char buffer[DEV_BSIZE]; +static size_t fragsz; + +static void +mkdumpheader(struct kerneldumpheader *kdh, uint64_t dumplen) +{ + bzero(kdh, sizeof(*kdh)); + strncpy(kdh->magic, KERNELDUMPMAGIC, sizeof(kdh->magic)); + strncpy(kdh->architecture, MACHINE_ARCH, sizeof(kdh->architecture)); + kdh->version =3D htod32(KERNELDUMPVERSION); + kdh->dumptype =3D htod32(dumptype); + kdh->dumplength =3D htod64(dumplen); + kdh->dumptime =3D htod64(time_second); + kdh->blocksize =3D htod32(di.blocksize); + strncpy(kdh->hostname, hostname, sizeof(kdh->hostname)); + strncpy(kdh->versionstring, version, sizeof(kdh->versionstring)); + if (panicstr !=3D NULL) + strncpy(kdh->panicstring, panicstr, sizeof(kdh->panicstring)); + kdh->parity =3D kerneldump_parity(kdh); +} + +int dump_write(char *ptr, size_t sz) +{ + size_t len; + int error; + static u_int64_t count =3D 0; + + if (fragsz =3D=3D 0 && (sz % DEV_BSIZE =3D=3D 0)) { + /* optimize if operation is in the edge of block */ + while (sz) { + error =3D di.dumper(di.priv, ptr, 0, dumplo, + DEV_BSIZE); + if (error) + return (error); + if (count++ % 1024) + printf("."); + dumplo +=3D DEV_BSIZE; + sz -=3D DEV_BSIZE; + ptr +=3D DEV_BSIZE; + } + } + else { + while (sz) { + len =3D DEV_BSIZE - fragsz; + if (len > sz) + len =3D sz; + bcopy(ptr, buffer + fragsz, len); + fragsz +=3D len; + ptr +=3D len; + sz -=3D len; + if (fragsz =3D=3D DEV_BSIZE) { + error =3D di.dumper(di.priv, buffer, 0, dumplo, + DEV_BSIZE); + if (error) + return error; + if (count++ % 1024) + printf("."); + dumplo +=3D DEV_BSIZE; + fragsz =3D 0; + } + } + } + return (0); +} + +int dump_open(size_t dumpsize) +{ + int error =3D 0; + size_t realsize; + + realsize =3D DEV_ALIGN(dumpsize); + + /* Check dump device size. 64KB additional for safe */ + if (di.mediasize < SIZEOF_METADATA + realsize + sizeof(kdh) * 2 + 64 * 10= 24) + return (ENOSPC); + printf(" %u (aligned: %u)\n", dumpsize, realsize); + + dumplo =3D di.mediaoffset + di.mediasize - realsize; + dumplo -=3D sizeof(kdh) * 2; + + mkdumpheader(&kdh, realsize); + error =3D di.dumper(di.priv, &kdh, 0, dumplo, sizeof(kdh)); + dumplo +=3D sizeof(kdh); + return error; +} + +int dump_close(void) +{ + int error; + + if (fragsz !=3D 0) { + /* align to the block */ + error =3D di.dumper(di.priv, buffer, 0, dumplo, DEV_BSIZE); + dumplo +=3D DEV_BSIZE; + } + + error =3D di.dumper(di.priv, &kdh, 0, dumplo, sizeof(kdh)); + if (error =3D=3D 0) + error =3D di.dumper(di.priv, NULL, 0 , 0, 0); + printf("Dump tail header done.(%llu)\n", dumplo); + return (error); +} + +static int dokernelonlydump(void) +{ + struct vm_map_entry *map =3D &kernel_map->header; + while(map !=3D NULL) { + if ((map->eflags & MAP_ENTRY_IS_SUB_MAP) || + (map->eflags & MAP_ENTRY_NOCOREDUMP)) + continue; + printf("%x - %x\n", map->start, map->end); + map =3D map->next; + } + return 1; +} + +static int dominidump(void) +{ + int i; + uint64_t dumpsize; + + dumpsize =3D sizeof(dumppcb) + + curthread->td_kstack_pages * PAGE_SIZE + + sizeof(dumptid) + + sizeof(*curthread); + + printf("\nDumping mini dump\n"); + + i =3D dump_open(dumpsize); + if (i) { + printf("\nDump open failed (%d)\n", i); + return 0; + } + + i =3D dump_write((char*)&dumppcb, sizeof(dumppcb)); + i =3D dump_write((char*)&dumptid, sizeof(dumptid)); + i =3D dump_write((char*)curthread, sizeof(*curthread)); + i =3D dump_write((char *)curthread->td_kstack, curthread->td_kstack_pages= * PAGE_SIZE); + if (i) + { + printf("\nDump failed writing (%d)\n", i); + return 0; + } + + i =3D dump_close(); + if (i) { + printf("\nDump close failed (%d)\n", i); + return 0; + } + else { + printf("Done.\n"); + return 1; + } +} + +void +doadump(void) +{ + if (dumping) + return; + /* + * Sometimes people have to call this from the kernel debugger. + * (if 'panic' can not dump) + * Give them a clue as to why they can't dump. + */ + if (di.dumper =3D=3D NULL) { + printf("Cannot dump. No dump device defined.\n"); + return; + } + + savectx(&dumppcb); + dumptid =3D curthread->td_tid; + dumping++; + switch(dumptype) { + case MINIDUMP: + dominidump(); + break; + case KERNELDUMP: + dokernelonlydump(); + break; + case ASCIIDUMP: + break; + default: + dumpsys(&di); + } +} + +/* Registration of dumpers */ +int +set_dumper(struct dumperinfo *newdi) +{ + + if (newdi =3D=3D NULL) { + bzero(&di, sizeof di); + return (0); + } + if (di.dumper !=3D NULL) + return (EBUSY); + di =3D *newdi; + return (0); +} + +#if defined(__powerpc__) +void +dumpsys(struct dumperinfo *di __unused) +{ + + printf("Kernel dumps not implemented on this architecture\n"); +} +#endif Index: src/sys/sparc64/sparc64/dump_machdep.c diff -u src/sys/sparc64/sparc64/dump_machdep.c:1.8 src/sys/sparc64/sparc64/= dump_machdep.c:1.8.1000.1 --- src/sys/sparc64/sparc64/dump_machdep.c:1.8 Fri Jan 7 10:29:23 2005 +++ src/sys/sparc64/sparc64/dump_machdep.c Thu Jun 16 20:35:40 2005 @@ -65,7 +65,7 @@ strncpy(kdh->magic, KERNELDUMPMAGIC, sizeof(kdh->magic)); strncpy(kdh->architecture, MACHINE_ARCH, sizeof(kdh->architecture)); kdh->version =3D htod32(KERNELDUMPVERSION); - kdh->architectureversion =3D htod32(archver); + kdh->dumptype =3D htod32(FULLDUMP); kdh->dumplength =3D htod64(dumplen); kdh->dumptime =3D htod64(time_second); kdh->blocksize =3D htod32(blksz); Index: src/sys/sys/conf.h diff -u src/sys/sys/conf.h:1.222 src/sys/sys/conf.h:1.222.1000.1 --- src/sys/sys/conf.h:1.222 Thu Mar 31 18:29:57 2005 +++ src/sys/sys/conf.h Sun Jun 19 23:43:43 2005 @@ -280,20 +280,6 @@ int dev_stdclone(char *_name, char **_namep, const char *_stem, int *_unit= ); EVENTHANDLER_DECLARE(dev_clone, dev_clone_fn); =20 -/* Stuff relating to kernel-dump */ - -struct dumperinfo { - dumper_t *dumper; /* Dumping function. */ - void *priv; /* Private parts. */ - u_int blocksize; /* Size of block in bytes. */ - off_t mediaoffset; /* Initial offset in bytes. */ - off_t mediasize; /* Space available in bytes. */ -}; - -int set_dumper(struct dumperinfo *); -void dumpsys(struct dumperinfo *); -extern int dumping; /* system is dumping */ - /* D_TTY related functions */ d_close_t ttyclose; d_ioctl_t ttyioctl; Index: src/sys/sys/kerneldump.h diff -u src/sys/sys/kerneldump.h:1.6 src/sys/sys/kerneldump.h:1.6.1000.4 --- src/sys/sys/kerneldump.h:1.6 Mon Oct 21 01:03:15 2002 +++ src/sys/sys/kerneldump.h Mon Jun 20 09:32:16 2005 @@ -52,6 +52,14 @@ #define htod64(x) (x) #endif =20 +typedef enum +{ + FULLDUMP =3D 0, + MINIDUMP =3D 1, + ASCIIDUMP =3D 2, + KERNELDUMP =3D 3 +}dumpcoretype; + /* * All uintX_t fields are in dump byte order, which is the same as * network byte order. Use the macros defined above to read or @@ -64,11 +72,7 @@ char architecture[12]; uint32_t version; #define KERNELDUMPVERSION 1 - uint32_t architectureversion; -#define KERNELDUMP_ALPHA_VERSION 1 -#define KERNELDUMP_I386_VERSION 1 -#define KERNELDUMP_IA64_VERSION 1 -#define KERNELDUMP_SPARC64_VERSION 1 + uint32_t dumptype; uint64_t dumplength; /* excl headers */ uint64_t dumptime; uint32_t blocksize; @@ -94,5 +98,25 @@ return (parity); } =20 +#ifdef _KERNEL + +struct dumperinfo { + dumper_t *dumper; /* Dumping function. */ + void *priv; /* Private parts. */ + u_int blocksize; /* Size of block in bytes. */ + off_t mediaoffset; /* Initial offset in bytes. */ + off_t mediasize; /* Space available in bytes. */ +}; + +int set_dumper(struct dumperinfo *); +extern int dumping; /* system is dumping */ + +void doadump(void); +int dump_open(size_t dumpsize); +int dump_write(char* ptr, size_t sz); +int dump_close(void); +void dumpsys(struct dumperinfo *); + +#endif /* _KERNEL */ =20 #endif /* _SYS_KERNELDUMP_H */ Index: src/sys/dev/pst/pst-raid.c diff -u src/sys/dev/pst/pst-raid.c:1.14 src/sys/dev/pst/pst-raid.c:1.14.100= 2.1 --- src/sys/dev/pst/pst-raid.c:1.14 Wed Sep 15 23:39:28 2004 +++ src/sys/dev/pst/pst-raid.c Thu Jun 23 18:01:42 2005 @@ -36,6 +36,7 @@ #include #include #include +#include #include #include #include --oyUTqETQ0mS9luUI-- --9zSXsLTf0vkW971A Content-Type: application/pgp-signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.1 (FreeBSD) iD8DBQFCuozo/cVsHxFZiIoRAufiAJsF9MRYg+SM+UxrQp5E4Uw5DAhzQwCfVYiO ksPn7y71JA8swfy1L7yJtHo= =K6zN -----END PGP SIGNATURE----- --9zSXsLTf0vkW971A-- From owner-freebsd-arch@FreeBSD.ORG Thu Jun 23 13:53:38 2005 Return-Path: X-Original-To: freebsd-arch@freebsd.org Delivered-To: freebsd-arch@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 6C35716A41F for ; Thu, 23 Jun 2005 13:53:38 +0000 (GMT) (envelope-from obrien@NUXI.com) Received: from dragon.NUXI.org (trang.nuxi.com [66.93.134.19]) by mx1.FreeBSD.org (Postfix) with ESMTP id 4810F43D1D for ; Thu, 23 Jun 2005 13:53:38 +0000 (GMT) (envelope-from obrien@NUXI.com) Received: from dragon.NUXI.org (obrien@localhost [127.0.0.1]) by dragon.NUXI.org (8.13.4/8.13.4) with ESMTP id j5NDrbIX044329; Thu, 23 Jun 2005 06:53:37 -0700 (PDT) (envelope-from obrien@dragon.NUXI.org) Received: (from obrien@localhost) by dragon.NUXI.org (8.13.4/8.13.1/Submit) id j5NDrbdD044328; Thu, 23 Jun 2005 06:53:37 -0700 (PDT) (envelope-from obrien) Date: Thu, 23 Jun 2005 06:53:37 -0700 From: "David O'Brien" To: Peter Wemm Message-ID: <20050623135337.GA44255@dragon.NUXI.org> Mail-Followup-To: obrien@freebsd.org, Peter Wemm , freebsd-arch@freebsd.org References: <1e89cd51050616062241e9e201@mail.gmail.com> <200506222323.26666.peter@wemm.org> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <200506222323.26666.peter@wemm.org> X-Operating-System: FreeBSD 6.0-CURRENT Organization: The NUXI BSD Group X-Pgp-Rsa-Fingerprint: B7 4D 3E E9 11 39 5F A3 90 76 5D 69 58 D9 98 7A X-Pgp-Rsa-Keyid: 1024/34F9F9D5 User-Agent: Mutt/1.5.9i Cc: freebsd-arch@freebsd.org Subject: Re: Kernel Dump X-BeenThere: freebsd-arch@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list Reply-To: obrien@freebsd.org List-Id: Discussion related to FreeBSD architecture List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 23 Jun 2005 13:53:38 -0000 On Wed, Jun 22, 2005 at 11:23:25PM -0700, Peter Wemm wrote: > IA64 and Sparc systems usually had sparse memory configurations and the > old raw format didn't have any facility to avoid storing holes. .. > I've just rewritten the AMD64 crashdump support to use ELF like ia64. > In fact, I reused most of the ia64 code. We ran into serious problems > at work, first on the amd64 platform and now also the i386 platform. > The problem is that x86 machines are increasinly having memory holes. > The simplistic dump code has no way to skip the memory hole and tries > to dump things like the AGP frame buffer, pci card MMIO space, > PCI-Express configuration space (this means accessing hardware!!) and > so on. Hi Peter, This is great news! I'm really happy to see this work. Will we be able to switch to this for 6.0R? -- -- David (obrien@FreeBSD.org) From owner-freebsd-arch@FreeBSD.ORG Thu Jun 23 18:19:06 2005 Return-Path: X-Original-To: freebsd-arch@freebsd.org Delivered-To: freebsd-arch@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 0645D16A41C for ; Thu, 23 Jun 2005 18:19:06 +0000 (GMT) (envelope-from marcel@xcllnt.net) Received: from ns1.xcllnt.net (209-128-86-226.bayarea.net [209.128.86.226]) by mx1.FreeBSD.org (Postfix) with ESMTP id D2F9943D49 for ; Thu, 23 Jun 2005 18:19:03 +0000 (GMT) (envelope-from marcel@xcllnt.net) Received: from [192.168.4.250] (dhcp50.pn.xcllnt.net [192.168.4.250]) by ns1.xcllnt.net (8.13.3/8.13.3) with ESMTP id j5NIJ2eB003850; Thu, 23 Jun 2005 11:19:02 -0700 (PDT) (envelope-from marcel@xcllnt.net) In-Reply-To: <20050623102024.GA89874@frontfree.net> References: <20050623102024.GA89874@frontfree.net> Mime-Version: 1.0 (Apple Message framework v622) Content-Type: text/plain; charset=US-ASCII; format=flowed Message-Id: Content-Transfer-Encoding: 7bit From: Marcel Moolenaar Date: Thu, 23 Jun 2005 11:19:01 -0700 To: Xin LI X-Mailer: Apple Mail (2.622) Cc: howardsue@gmail.com, freebsd-arch@freebsd.org Subject: Re: How to get stack from every thread when doing crash dump? X-BeenThere: freebsd-arch@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Discussion related to FreeBSD architecture List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 23 Jun 2005 18:19:06 -0000 On Jun 23, 2005, at 3:20 AM, Xin LI wrote: > One problem with the mini-dump is that, since the mini-dump utilizes: > dump_write((char *)curthread->td_kstack, curthread->td_kstack_pages * > PAGE_SIZE); > > To write out the stack, and at the point before exception.S, curthread > has > been changed, we can only obtain the stack from the current thread, > which > may not be enough for analyzing the backtrace. What can we do to > improve > this situation? You can iterate over all the threads. Take a look at src/sys/kern/subr_kdb.c or src/gnu/usr.bin/gdb/kgdb/kthr.c In particular: Use the list of all processes (allproc) to iterate over the processeses and for each process walk the list of threads and for each thread dump the stack, registers and other data. -- Marcel Moolenaar USPA: A-39004 marcel@xcllnt.net From owner-freebsd-arch@FreeBSD.ORG Fri Jun 24 00:39:12 2005 Return-Path: X-Original-To: freebsd-arch@freebsd.org Delivered-To: freebsd-arch@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 4D06D16A420 for ; Fri, 24 Jun 2005 00:39:12 +0000 (GMT) (envelope-from howardsue@gmail.com) Received: from wproxy.gmail.com (wproxy.gmail.com [64.233.184.196]) by mx1.FreeBSD.org (Postfix) with ESMTP id F162343D55 for ; Fri, 24 Jun 2005 00:39:11 +0000 (GMT) (envelope-from howardsue@gmail.com) Received: by wproxy.gmail.com with SMTP id 69so64183wri for ; Thu, 23 Jun 2005 17:39:11 -0700 (PDT) DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=beta; d=gmail.com; h=received:message-id:date:from:reply-to:to:subject:cc:in-reply-to:mime-version:content-type:references; b=aoopP2088fyvZtXfdtmB+U8ds2nkR4ybnXdT212K3R7xWngUbaPJN0oWUq59wxeVOjRkpAbETv/fYswf4gaiQKYWksbL570gjTJ049aIjw6ddayIomUa/3dOSx6CUMcpQzogEXQpzGDTlj2CmHyxe95HFztvtm6rz6wq7hgmHcY= Received: by 10.54.86.1 with SMTP id j1mr1477541wrb; Thu, 23 Jun 2005 17:39:10 -0700 (PDT) Received: by 10.54.124.4 with HTTP; Thu, 23 Jun 2005 17:39:04 -0700 (PDT) Message-ID: <1e89cd5105062317397399075e@mail.gmail.com> Date: Fri, 24 Jun 2005 08:39:04 +0800 From: Howard To: Marcel Moolenaar In-Reply-To: Mime-Version: 1.0 References: <20050623102024.GA89874@frontfree.net> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable Content-Disposition: inline X-Content-Filtered-By: Mailman/MimeDel 2.1.5 Cc: freebsd-arch@freebsd.org Subject: Re: How to get stack from every thread when doing crash dump? X-BeenThere: freebsd-arch@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list Reply-To: Howard List-Id: Discussion related to FreeBSD architecture List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 24 Jun 2005 00:39:12 -0000 2005/6/24, Marcel Moolenaar :=20 >=20 > On Jun 23, 2005, at 3:20 AM, Xin LI wrote: >=20 > > One problem with the mini-dump is that, since the mini-dump utilizes:= =20 > > dump_write((char *)curthread->td_kstack, curthread->td_kstack_pages * > > PAGE_SIZE); > > > > To write out the stack, and at the point before exception.S, curthread > > has > > been changed, we can only obtain the stack from the current thread,=20 > > which > > may not be enough for analyzing the backtrace. What can we do to > > improve > > this situation? >=20 > You can iterate over all the threads. Take a look at > src/sys/kern/subr_kdb.c=20 > or > src/gnu/usr.bin/gdb/kgdb/kthr.c >=20 > In particular: > Use the list of all processes (allproc) to iterate over the > processeses and for each process walk the list of threads > and for each thread dump the stack, registers and other data.=20 However is dumping the td_kstack_pages enough to get one thread's stack? W= e=20 found the stack is not completed. Thanks, =20 -- > Marcel Moolenaar USPA: A-39004 marcel@xcllnt.net=20 >=20 > From owner-freebsd-arch@FreeBSD.ORG Fri Jun 24 00:45:16 2005 Return-Path: X-Original-To: freebsd-arch@freebsd.org Delivered-To: freebsd-arch@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 64F4416A41C for ; Fri, 24 Jun 2005 00:45:16 +0000 (GMT) (envelope-from marcel@xcllnt.net) Received: from ns1.xcllnt.net (209-128-86-226.bayarea.net [209.128.86.226]) by mx1.FreeBSD.org (Postfix) with ESMTP id 3AAC743D49 for ; Fri, 24 Jun 2005 00:45:16 +0000 (GMT) (envelope-from marcel@xcllnt.net) Received: from [192.168.4.250] (dhcp50.pn.xcllnt.net [192.168.4.250]) by ns1.xcllnt.net (8.13.3/8.13.3) with ESMTP id j5O0jFQa005554; Thu, 23 Jun 2005 17:45:16 -0700 (PDT) (envelope-from marcel@xcllnt.net) In-Reply-To: <1e89cd5105062317397399075e@mail.gmail.com> References: <20050623102024.GA89874@frontfree.net> <1e89cd5105062317397399075e@mail.gmail.com> Mime-Version: 1.0 (Apple Message framework v622) Content-Type: text/plain; charset=ISO-8859-1; format=flowed Message-Id: <947299be8f3206c1a165c67af5c44d16@xcllnt.net> Content-Transfer-Encoding: quoted-printable From: Marcel Moolenaar Date: Thu, 23 Jun 2005 17:45:14 -0700 To: Howard X-Mailer: Apple Mail (2.622) Cc: freebsd-arch@freebsd.org Subject: Re: How to get stack from every thread when doing crash dump? X-BeenThere: freebsd-arch@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Discussion related to FreeBSD architecture List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 24 Jun 2005 00:45:16 -0000 On Jun 23, 2005, at 5:39 PM, Howard wrote: > 2005/6/24, Marcel Moolenaar : On Jun 23, 2005, at=20= > 3:20 AM, Xin LI wrote: >> >> > One problem with the mini-dump is that, since the mini-dump=20 >> utilizes: >> >=A0=A0=A0=A0=A0=A0 dump_write((char *)curthread->td_kstack,=20 >> curthread->td_kstack_pages * >> > PAGE_SIZE); >> > >> > To write out the stack, and at the point before exception.S,=20 >> curthread >> > has >> > been changed, we can only obtain the stack from the current thread, >> > which >> > may not be enough for analyzing the backtrace.=A0=A0What can we do = to >> > improve >> > this situation? >> >> You can iterate over all the threads. Take a look at >> =A0=A0=A0=A0=A0=A0 src/sys/kern/subr_kdb.c >> or >> =A0=A0=A0=A0=A0=A0 src/gnu/usr.bin/gdb/kgdb/kthr.c >> >> In particular: >> Use the list of all processes (allproc) to iterate over the >> processeses and for each process walk the list of threads >> and for each thread dump the stack, registers and other data.=A0 > However is dumping the td_kstack_pages enough to get one thread's=20 > stack? We found the stack is not completed. What do you mean with "not completed"? --=20 Marcel Moolenaar USPA: A-39004 marcel@xcllnt.net From owner-freebsd-arch@FreeBSD.ORG Fri Jun 24 01:01:46 2005 Return-Path: X-Original-To: freebsd-arch@freebsd.org Delivered-To: freebsd-arch@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 37AD016A41C; Fri, 24 Jun 2005 01:01:46 +0000 (GMT) (envelope-from peter@wemm.org) Received: from canning.wemm.org (canning.wemm.org [192.203.228.65]) by mx1.FreeBSD.org (Postfix) with ESMTP id 19E4343D1F; Fri, 24 Jun 2005 01:01:46 +0000 (GMT) (envelope-from peter@wemm.org) Received: from fw.wemm.org (canning.wemm.org [192.203.228.65]) by canning.wemm.org (Postfix) with ESMTP id F23FE2A8DA; Thu, 23 Jun 2005 18:01:45 -0700 (PDT) (envelope-from peter@wemm.org) Received: from overcee.wemm.org (overcee.wemm.org [10.0.0.3]) by fw.wemm.org (Postfix) with ESMTP id AAEE8E2B3; Thu, 23 Jun 2005 18:01:45 -0700 (PDT) (envelope-from peter@wemm.org) Received: from overcee.wemm.org (localhost [127.0.0.1]) by overcee.wemm.org (8.13.3/8.13.1) with ESMTP id j5O11iwn059517; Thu, 23 Jun 2005 18:01:44 -0700 (PDT) (envelope-from peter@wemm.org) Received: from localhost (localhost [[UNIX: localhost]]) by overcee.wemm.org (8.13.3/8.13.1/Submit) id j5O11h51059516; Thu, 23 Jun 2005 18:01:43 -0700 (PDT) (envelope-from peter@wemm.org) X-Authentication-Warning: overcee.wemm.org: peter set sender to peter@wemm.org using -f From: Peter Wemm To: obrien@freebsd.org Date: Thu, 23 Jun 2005 18:01:43 -0700 User-Agent: KMail/1.8 References: <1e89cd51050616062241e9e201@mail.gmail.com> <200506222323.26666.peter@wemm.org> <20050623135337.GA44255@dragon.NUXI.org> In-Reply-To: <20050623135337.GA44255@dragon.NUXI.org> MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Content-Disposition: inline Message-Id: <200506231801.43669.peter@wemm.org> Cc: freebsd-arch@freebsd.org Subject: Re: Kernel Dump X-BeenThere: freebsd-arch@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Discussion related to FreeBSD architecture List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 24 Jun 2005 01:01:46 -0000 On Thursday 23 June 2005 06:53 am, David O'Brien wrote: > On Wed, Jun 22, 2005 at 11:23:25PM -0700, Peter Wemm wrote: > > IA64 and Sparc systems usually had sparse memory configurations and > > the old raw format didn't have any facility to avoid storing holes. > > .. > > > I've just rewritten the AMD64 crashdump support to use ELF like > > ia64. In fact, I reused most of the ia64 code. We ran into serious > > problems at work, first on the amd64 platform and now also the i386 > > platform. The problem is that x86 machines are increasinly having > > memory holes. The simplistic dump code has no way to skip the > > memory hole and tries to dump things like the AGP frame buffer, pci > > card MMIO space, PCI-Express configuration space (this means > > accessing hardware!!) and so on. > > Hi Peter, > > This is great news! I'm really happy to see this work. Will we be > able to switch to this for 6.0R? I'd very much like for this to happen. I've been testing primarily with amd64, but Paul Saab is doing a quick port to i386 (should be trivial). The good news is that the libkvm impact is pretty much trivial. I was pleasantly surprised. There'll be patches to look at shortly. BTW: It turns out that sparc64 uses its own custom dump format. It uses a custom region descriptor instead of elf's core dump chunk descriptors. I believe it also passes a pointer to its kernel page table. -- Peter Wemm - peter@wemm.org; peter@FreeBSD.org; peter@yahoo-inc.com "All of this is for nothing if we don't go to the stars" - JMS/B5 From owner-freebsd-arch@FreeBSD.ORG Fri Jun 24 01:15:52 2005 Return-Path: X-Original-To: freebsd-arch@freebsd.org Delivered-To: freebsd-arch@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id E014816A41C for ; Fri, 24 Jun 2005 01:15:51 +0000 (GMT) (envelope-from peter@wemm.org) Received: from canning.wemm.org (canning.wemm.org [192.203.228.65]) by mx1.FreeBSD.org (Postfix) with ESMTP id BEA5343D1F for ; Fri, 24 Jun 2005 01:15:51 +0000 (GMT) (envelope-from peter@wemm.org) Received: from fw.wemm.org (canning.wemm.org [192.203.228.65]) by canning.wemm.org (Postfix) with ESMTP id 6CFE72A8F8 for ; Thu, 23 Jun 2005 18:15:51 -0700 (PDT) (envelope-from peter@wemm.org) Received: from overcee.wemm.org (overcee.wemm.org [10.0.0.3]) by fw.wemm.org (Postfix) with ESMTP id B9F3EE2B3 for ; Thu, 23 Jun 2005 18:15:50 -0700 (PDT) (envelope-from peter@wemm.org) Received: from overcee.wemm.org (localhost [127.0.0.1]) by overcee.wemm.org (8.13.3/8.13.1) with ESMTP id j5O1FjIS059893; Thu, 23 Jun 2005 18:15:45 -0700 (PDT) (envelope-from peter@wemm.org) Received: from localhost (localhost [[UNIX: localhost]]) by overcee.wemm.org (8.13.3/8.13.1/Submit) id j5O1FiW2059892; Thu, 23 Jun 2005 18:15:44 -0700 (PDT) (envelope-from peter@wemm.org) X-Authentication-Warning: overcee.wemm.org: peter set sender to peter@wemm.org using -f From: Peter Wemm To: freebsd-arch@freebsd.org Date: Thu, 23 Jun 2005 18:15:43 -0700 User-Agent: KMail/1.8 References: <20050623102024.GA89874@frontfree.net> In-Reply-To: <20050623102024.GA89874@frontfree.net> MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Content-Disposition: inline Message-Id: <200506231815.44052.peter@wemm.org> Cc: howardsue@gmail.com Subject: Re: How to get stack from every thread when doing crash dump? X-BeenThere: freebsd-arch@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Discussion related to FreeBSD architecture List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 24 Jun 2005 01:15:52 -0000 On Thursday 23 June 2005 03:20 am, Xin LI wrote: > Dear folks, > > Recently I was working with a friend to figure out whether we can do > more on our crashdump mechanism, as dumping the whole core memory is > a painful process when you have some gigabytes of RAM. Finally, we > have implemented an experimental mini-dump on our local development > tree, and adopted some IA64 MD dump code to provide a MI interface to > handle dumping. A proof-of- concept patchset is included (see > below). As a side note, > > One problem with the mini-dump is that, since the mini-dump utilizes: > dump_write((char *)curthread->td_kstack, curthread->td_kstack_pages > * PAGE_SIZE); > > To write out the stack, and at the point before exception.S, > curthread has been changed, we can only obtain the stack from the > current thread, which may not be enough for analyzing the backtrace. > What can we do to improve this situation? As Marcel suggested, this really needs all the kernel stacks from all threads to be truely useful. But I wonder if what you're running into is possibly a result of gdb not parsing the stack frames from exception.s? We do not emit any dwarf2 call frame information for any assembler code, and gdb6 is dwarf2 based. And since it is dwarf2 based, during the last cleanups the gdb developers did, they removed (or moved) the places that we used to insert stack frame sniffers to cope with crossing the nonstandard assembler stack frames. As a result, we don't generally show traces that cross exceptions any more. If that is the problem you're seeing, then the fix is that somebody needs to annotate the *.s and *.S files with .cfa_* pseudo-ops so that dwarf2 frame descriptors are emitted for a -g kernel. This is non-trivial though. > Thanks in advance! > > --------------------------------------------------------------------- >----- BTW: A proof-of-concept patchset is in the attachment, which > implements mini-dump, and adopted the MD code from IA64 dump by > turning them to MI interfaces. At this time, the idea that peter@ > has commented this morning has not implemented (yet), and we need to > do more style cleanups on the code. Yes, there is lots of work still to do there. :-) -- Peter Wemm - peter@wemm.org; peter@FreeBSD.org; peter@yahoo-inc.com "All of this is for nothing if we don't go to the stars" - JMS/B5 From owner-freebsd-arch@FreeBSD.ORG Sat Jun 25 03:59:28 2005 Return-Path: X-Original-To: freebsd-arch@freebsd.org Delivered-To: freebsd-arch@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 880DD16A41C for ; Sat, 25 Jun 2005 03:59:28 +0000 (GMT) (envelope-from dwhite@gumbysoft.com) Received: from carver.gumbysoft.com (carver.gumbysoft.com [66.220.23.50]) by mx1.FreeBSD.org (Postfix) with ESMTP id 76E2D43D53 for ; Sat, 25 Jun 2005 03:59:28 +0000 (GMT) (envelope-from dwhite@gumbysoft.com) Received: by carver.gumbysoft.com (Postfix, from userid 1000) id 6BF7D72DE5; Fri, 24 Jun 2005 20:59:28 -0700 (PDT) Received: from localhost (localhost [127.0.0.1]) by carver.gumbysoft.com (Postfix) with ESMTP id 69FA072DE4; Fri, 24 Jun 2005 20:59:28 -0700 (PDT) Date: Fri, 24 Jun 2005 20:59:28 -0700 (PDT) From: Doug White To: Yuri In-Reply-To: <42B667D0.8020003@tsoft.com> Message-ID: <20050624205753.C47411@carver.gumbysoft.com> References: <42B667D0.8020003@tsoft.com> MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII Cc: freebsd-arch@freebsd.org Subject: Re: Plans to support web-cams on FreeBSD ? X-BeenThere: freebsd-arch@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Discussion related to FreeBSD architecture List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 25 Jun 2005 03:59:28 -0000 On Sun, 19 Jun 2005, Yuri wrote: > > Are there plans to support webcams under FreeBSD ? There has been talk on and off on -multimedia about a Video4BSD API that would handle most image-capture devices. A big problem with your average USB webcam is that there are six million proprietary different camera interfaces and even with an API if there is no drivers its useless. > It must be possible to make some infrastructure allowing to use linux > videodevice drivers with minimal changes. Good luck :) -- Doug White | FreeBSD: The Power to Serve dwhite@gumbysoft.com | www.FreeBSD.org From owner-freebsd-arch@FreeBSD.ORG Sat Jun 25 03:59:55 2005 Return-Path: X-Original-To: freebsd-arch@FreeBSD.org Delivered-To: freebsd-arch@FreeBSD.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 7DE1F16A41F for ; Sat, 25 Jun 2005 03:59:55 +0000 (GMT) (envelope-from dwhite@gumbysoft.com) Received: from carver.gumbysoft.com (carver.gumbysoft.com [66.220.23.50]) by mx1.FreeBSD.org (Postfix) with ESMTP id 36CF743D53 for ; Sat, 25 Jun 2005 03:59:55 +0000 (GMT) (envelope-from dwhite@gumbysoft.com) Received: by carver.gumbysoft.com (Postfix, from userid 1000) id 2CF4772DE7; Fri, 24 Jun 2005 20:59:55 -0700 (PDT) Received: from localhost (localhost [127.0.0.1]) by carver.gumbysoft.com (Postfix) with ESMTP id 2AD1772DDF; Fri, 24 Jun 2005 20:59:55 -0700 (PDT) Date: Fri, 24 Jun 2005 20:59:55 -0700 (PDT) From: Doug White To: Peter Innes In-Reply-To: <200506210303.j5L33m425805@bo.nznet.gen.nz> Message-ID: <20050624205937.N47411@carver.gumbysoft.com> References: <200506210303.j5L33m425805@bo.nznet.gen.nz> MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII Cc: freebsd-arch@FreeBSD.org Subject: RE: JRE 1.4 and freebsd X-BeenThere: freebsd-arch@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Discussion related to FreeBSD architecture List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 25 Jun 2005 03:59:55 -0000 In the future, please direct questions of this type to questions@freebsd.org. On Tue, 21 Jun 2005, Peter Innes wrote: > Could you tell me if JRE 1.4 can be used with Freebsd? Yes. -- Doug White | FreeBSD: The Power to Serve dwhite@gumbysoft.com | www.FreeBSD.org From owner-freebsd-arch@FreeBSD.ORG Sat Jun 25 04:14:46 2005 Return-Path: X-Original-To: freebsd-arch@freebsd.org Delivered-To: freebsd-arch@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id A5DCC16A41C for ; Sat, 25 Jun 2005 04:14:46 +0000 (GMT) (envelope-from yuri@tsoft.com) Received: from ylpvm12.prodigy.net (ylpvm12-ext.prodigy.net [207.115.57.43]) by mx1.FreeBSD.org (Postfix) with ESMTP id 639C943D1D for ; Sat, 25 Jun 2005 04:14:46 +0000 (GMT) (envelope-from yuri@tsoft.com) Received: from ylpvm01.prodigy.net (ylpvm01-int.prodigy.net [207.115.5.207]) by ylpvm12.prodigy.net (8.12.10 outbound/8.12.10) with ESMTP id j5P4EhG2001312 for ; Sat, 25 Jun 2005 00:14:44 -0400 Received: from eagle.syrec.org (adsl-63-206-193-240.dsl.snfc21.pacbell.net [63.206.193.240]) by ylpvm01.prodigy.net (8.13.4 dk-milter linux/8.13.4) with ESMTP id j5P4EgPG017980; Sat, 25 Jun 2005 00:14:42 -0400 Received: from [127.0.0.1] (localhost.syrec.org [127.0.0.1]) by eagle.syrec.org (8.13.3/8.13.3) with ESMTP id j5P4Edjn000733; Fri, 24 Jun 2005 21:14:40 -0700 (PDT) (envelope-from yuri@tsoft.com) Message-ID: <42BCDA2F.5020907@tsoft.com> Date: Fri, 24 Jun 2005 21:14:39 -0700 From: Yuri User-Agent: Mozilla Thunderbird 1.0.2 (X11/20050404) X-Accept-Language: en-us, en MIME-Version: 1.0 To: Doug White References: <42B667D0.8020003@tsoft.com> <20050624205753.C47411@carver.gumbysoft.com> In-Reply-To: <20050624205753.C47411@carver.gumbysoft.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Cc: freebsd-arch@freebsd.org Subject: Re: Plans to support web-cams on FreeBSD ? X-BeenThere: freebsd-arch@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Discussion related to FreeBSD architecture List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 25 Jun 2005 04:14:46 -0000 > >There has been talk on and off on -multimedia about a Video4BSD API that >would handle most image-capture devices. > >A big problem with your average USB webcam is that there are six million >proprietary different camera interfaces and even with an API if there is >no drivers its useless. > > > Yes but there are several major webcam chipsets that get great image quality. Like Philips PWC chipset that is in zillion modern webcams, Divia NV802 -- same. 3-4 supported chipsets would make a great difference already. FreeBSD should be fully suitable to run as home PC and w/out webcam support at all it hardly can. Yuri From owner-freebsd-arch@FreeBSD.ORG Sat Jun 25 22:59:35 2005 Return-Path: X-Original-To: freebsd-arch@freebsd.org Delivered-To: freebsd-arch@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id BF6C616A41C for ; Sat, 25 Jun 2005 22:59:35 +0000 (GMT) (envelope-from v.velox@vvelox.net) Received: from S3.cableone.net (smtp3.cableone.net [24.116.0.229]) by mx1.FreeBSD.org (Postfix) with ESMTP id 8C44B43D1F for ; Sat, 25 Jun 2005 22:59:35 +0000 (GMT) (envelope-from v.velox@vvelox.net) Received: from vixen42.local.lan (unverified [24.119.122.41]) by S3.cableone.net (CableOne SMTP Service S3) with ESMTP id 23954283 for multiple; Sat, 25 Jun 2005 16:11:05 -0700 Date: Sat, 25 Jun 2005 18:01:50 -0500 From: Vulpes Velox To: Yuri Message-ID: <20050625180150.3b3615a3@vixen42.local.lan> In-Reply-To: <42BCDA2F.5020907@tsoft.com> References: <42B667D0.8020003@tsoft.com> <20050624205753.C47411@carver.gumbysoft.com> <42BCDA2F.5020907@tsoft.com> X-Mailer: Sylpheed-Claws 1.9.11 (GTK+ 2.6.8; i386-portbld-freebsd5.4) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-IP-stats: Incoming Last 0, First 38, in=64, out=0, spam=0 X-External-IP: 24.119.122.41 X-Abuse-Info: Send abuse complaints to abuse@cableone.net Cc: freebsd-arch@freebsd.org Subject: Re: Plans to support web-cams on FreeBSD ? X-BeenThere: freebsd-arch@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Discussion related to FreeBSD architecture List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 25 Jun 2005 22:59:35 -0000 On Fri, 24 Jun 2005 21:14:39 -0700 Yuri wrote: > > > > >There has been talk on and off on -multimedia about a Video4BSD > >API that would handle most image-capture devices. > > > >A big problem with your average USB webcam is that there are six > >million proprietary different camera interfaces and even with an > >API if there is no drivers its useless. > > > > > > > Yes but there are several major webcam chipsets that get great > image quality. > Like Philips PWC chipset that is in zillion modern webcams, Divia > NV802 -- same. > > 3-4 supported chipsets would make a great difference already. > > FreeBSD should be fully suitable to run as home PC and w/out webcam > support at all it hardly can. Firewire video capture is workable. Brooktree cards work as well as the PVR250 and IIRC PVR350. Not sure about the price of a firewire cam, but last time I checked uber cheap ntsc cams were easy to find.